我正在尝试创建一个可以读取和编译opengl顶点和片段着色器文件的函数,但是我收到了这个错误:
'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str': non-standard syntax; use '&' to create a pointer to member
Run Code Online (Sandbox Code Playgroud)
我不太清楚如何解决它.这是我的代码:
GLuint shader_load(const GLchar* vertex, const GLchar* fragment) {
std::string ver = file_read_all(vertex);
std::string frag = file_read_all(fragment);
const GLchar* verCode = ver.c_str;
const GLchar* fragCode = frag.c_str;
GLuint program;
GLuint verShader, fragShader;
GLint success;
GLchar log[512];
verShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(verShader, 1, &verCode, NULL);
glCompileShader(verShader);
glGetShaderiv(verShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(verShader, 512, NULL, log);
std::cout << "Failed to compile Vertex Shader\n" << log << std::endl;
return NULL;
} …Run Code Online (Sandbox Code Playgroud) 使用g ++ 3.4和4.7,我观察到以下奇怪的行为:
如果需要用户定义的转换,则函数模板不匹配,其中普通函数将是.我在C++ 98标准中找不到相应的规则.g ++是否正确,(我假设)?或者这是一个错误?
template <class T>
int x(auto_ptr_ref<T> p)
{
return 1;
}
// this would match
/*
int x(auto_ptr_ref<int> p)
{
return 2;
}
*/
void dummy()
{
cout << x(auto_ptr<int>()) << endl;
}
Run Code Online (Sandbox Code Playgroud) c++ templates function overload-resolution implicit-conversion
我对这两个感到困惑.我知道C++引用本身就是常量,一旦设置它们就无法更改为引用别的东西.
在C++中,多次声明变量会在编译期间显示错误.例如:
int x;
int x;
Run Code Online (Sandbox Code Playgroud)
在多次声明函数时,编译期间不会显示任何错误.例如:
int add(int, int);
int add(int, int);
Run Code Online (Sandbox Code Playgroud)
为什么在C++中有这种区别?
鉴于下面的示例,我很惊讶地发现尽管显式删除了默认构造函数(或者默认为此),但仍然可以进行聚合初始化.
#include <iostream>
struct DefaultPrivate
{
const int n_;
static const DefaultPrivate& create();
private:
DefaultPrivate() = delete;
};
const DefaultPrivate& DefaultPrivate::create()
{
static DefaultPrivate result{10};
return result;
}
int main() {
DefaultPrivate x; //Fails
DefaultPrivate y{10};//Works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
私有默认(或删除)构造与聚合初始化之间的关系是否未在标准中指定?
GCC 6.3和VCC 2017就属于这种情况
我问这个问题的原因是,我希望更改对默认构造函数的访问会阻止公共聚合初始化
c++ initialization language-lawyer aggregate-initialization c++11
我试图了解重载 - >运算符是如何工作的.我有以下课程
class Message {
public:
Message(string message) :m_text(message) {}
void printText() {
cout << "text is " << m_text << endl;
}
string m_text;
};
class MessagePointerWrapper
{
public:
MessagePointerWrapper(string message) {
m_message = std::make_unique<Message>(message);
}
Message* operator->() {
return m_message.get();
}
std::unique_ptr<Message> m_message;
};
int main(int argc, char** argv)
{
MessagePointerWrapper messageWrapper = MessagePointerWrapper("Hello World");
messageWrapper.m_message->printText();
messageWrapper->m_text = "PQR";
messageWrapper.m_message->printText();
}
Run Code Online (Sandbox Code Playgroud)
该MessageWrapper级的->运算符重载以返回Message*.所以在主要方法中,当我调用messageWrapper->它返回的是一个Message*.通常当我有一个指针时,我需要使用->运算符或deference运算符来访问该对象.根据该逻辑,为了访问对象的m_text可用性Message …
我试图用std::remove_if它从一个简单的字符串中删除空格,但结果却很奇怪。有人可以帮我弄清楚发生了什么吗?
该代码是:
#include <iostream>
#include <algorithm>
#include <string>
int main(int argc, char * argv[])
{
std::string test = "a b";
std::remove_if(test.begin(), test.end(), isspace);
std::cout << "test : " << test << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这只是打印出来:
test : ab
Run Code Online (Sandbox Code Playgroud)
但是我得到了
test : abb
Run Code Online (Sandbox Code Playgroud)
尝试另一个字符串,我得到:
输入:“ a bcde uv xy”
输出:“ abcdeuvxy xy”
似乎它在复制最后一个“单词”,但有时会添加一个空格。我怎样才能在不做任何奇怪的事情的情况下删除所有空间?
我可以按如下方式验证函数签名:
template <typename>
struct FnType
{
static bool const valid = false;
};
struct FnType<void(int)>
{
static bool const valid = true;
};
void foo(int)
{
}
FnType<decltype(foo)>::valid; //true
Run Code Online (Sandbox Code Playgroud)
如何验证类方法签名?
class Y
{
public:
void foo(int)
{
}
};
FnType<decltype(&Y::foo)>::valid; //false??
Run Code Online (Sandbox Code Playgroud)
我想验证Y::foo返回类型和参数类型是否有效。
如果我有这样的代码
class Node {
public:
Node *subnodes[10];
};
Node x = Node();
Run Code Online (Sandbox Code Playgroud)
代码运行后是否有保证x->subnodes[0] == nullptr?
我不是 C++ 专家,我发现 C++ 规范令人生畏。这在实践中是可行的,但是规范是否保证在这种情况下将 nullptr 放入数组的每个元素中(而不是说,潜在的垃圾)?到目前为止,我还没有通过找到权威的规范语言来说服自己,并且在野外我看到很多代码示例似乎不相信这是真的。所以,经过一段时间未能想出答案后,我转向你, stack overflow。提前致谢。
我正在使用这个成员函数来获取指向对象的指针:
virtual Object* Create()
{
return new Object();
}
Run Code Online (Sandbox Code Playgroud)
它是虚拟的,所以我可以得到指向派生对象的指针,现在我这样做:
virtual Object* Create()
{
return new Foo();
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我想做这样的事情以防止任何错误并使其更容易,这样我就不必每次创建新类时都重写该函数:
virtual Object* Create()
{
return new this();
}
Run Code Online (Sandbox Code Playgroud)
我试图找到如何做到这一点,但找不到任何有用的东西,也许这是不可能的。我在 C++17 中使用 MSVC 编译器
c++ ×10
templates ×2
arrays ×1
c++11 ×1
c++17 ×1
class ×1
const ×1
declaration ×1
definition ×1
function ×1
opengl ×1
reference ×1
string ×1
type-traits ×1
types ×1
visual-c++ ×1