小编son*_*yao的帖子

'std :: basic_string <char,std :: char_traits <char>,std :: allocator <char >> :: c_str':非标准语法; 使用'&'创建指向成员的指针

我正在尝试创建一个可以读取和编译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)

c++ opengl

6
推荐指数
1
解决办法
2万
查看次数

C++重载决策,用户定义的转换和功能模板

使用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

6
推荐指数
1
解决办法
51
查看次数

"const int&jj"和"int&const jj"有什么区别?

我对这两个感到困惑.我知道C++引用本身就是常量,一旦设置它们就无法更改为引用别的东西.

c++ const reference language-lawyer

6
推荐指数
1
解决办法
683
查看次数

在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++中有这种区别?

c++ declaration definition one-definition-rule

6
推荐指数
1
解决办法
1650
查看次数

聚合初始化不支持构造函数访问

鉴于下面的示例,我很惊讶地发现尽管显式删除了默认构造函数(或者默认为此),但仍然可以进行聚合初始化.

#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

6
推荐指数
1
解决办法
508
查看次数

关于重载 - >运算符的说明

我试图了解重载 - >运算符是如何工作的.我有以下课程

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 …

c++ operator-overloading

6
推荐指数
2
解决办法
180
查看次数

C ++带有remove_if的异常行为

我试图用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”

似乎它在复制最后一个“单词”,但有时会添加一个空格。我怎样才能在不做任何奇怪的事情的情况下删除所有空间?

c++ string stl-algorithm

6
推荐指数
1
解决办法
71
查看次数

如何验证类方法签名?

我可以按如下方式验证函数签名:

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返回类型和参数类型是否有效。

c++ templates types class

6
推荐指数
1
解决办法
73
查看次数

在 C++ 中,指针类型数组的元素是否保证默认初始化为 nullptr?

如果我有这样的代码

class Node {
public:
    Node *subnodes[10];
};
Node x = Node();
Run Code Online (Sandbox Code Playgroud)

代码运行后是否有保证x->subnodes[0] == nullptr

我不是 C++ 专家,我发现 C++ 规范令人生畏。这在实践中是可行的,但是规范是否保证在这种情况下将 nullptr 放入数组的每个元素中(而不是说,潜在的垃圾)?到目前为止,我还没有通过找到权威的规范语言来说服自己,并且在野外我看到很多代码示例似乎不相信这是真的。所以,经过一段时间未能想出答案后,我转向你, stack overflow。提前致谢。

c++ arrays initialization value-initialization

6
推荐指数
1
解决办法
64
查看次数

C++中可重用的成员函数

我正在使用这个成员函数来获取指向对象的指针:

    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++ type-traits visual-c++ c++17

6
推荐指数
1
解决办法
107
查看次数