这是OpenGL Super Bible第7版的片段:
localdata
乍一看,将add_library(libbozorth3 STATIC ${LIB_SOURCE_FILES})
set_property(TARGET libbozorth3 PROPERTY OUTPUT_NAME bozorth3)
target_include_directories(libbozorth3 PRIVATE
include)
add_executable(bozorth3 ${BIN_SOURCE_FILEs})
target_include_directories(bozorth3 PRIVATE
include)
target_link_libraries(bozorth3
PRIVATE
libbozorth3
commonnbis)
作为一个参数传递给这个函数似乎很奇怪,当然clang立即抗议:GLint log_length;
glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &log_length);
std::string str;
str.reserve(log_length);
glGetShaderInfoLog(fs, log_length, NULL, str.c_str());
。
所以我尝试调查并将str.c_str()
更改为cannot initialize a parameter of type 'GLchar *' (aka 'char *') with an rvalue of type 'const char *'
,它应该提供指向内部数据数组的指针,但这会产生相同的错误消息。 修改: str.c_str()
和str.data()
实际上是相同的事情(至少在c ++ 11中),所以我们使用哪一个并不重要。
我做了一些搜索,但没有找到解决方案(虽然我对C ++很新,有些事情对我来说仍然不明显)。
这是书中的错误吗?有没有办法让它与std :: string一起使用?
答案 0 :(得分:5)
string::c_str()
和string::data()
都会返回const char*
直到C ++ 17。从C ++ 17开始,string::data()
的重载将返回char*
。这意味着此代码段无效。
编辑:使用&str[0]
更简单有效的解决方案。下标运算符将返回char&
。
如果你不能使用C ++ 17,你可以使用std::vector<char>
,它有一个非const data()
,但这会在构造std::string
时产生一个副本:
// ...
std::vector<char> v(log_length);
glGetShaderInfoLog(fs, log_length, NULL, v.data());
std::string s(begin(v), end(v));
此外,reserve()
还不够,因为实际的size()
不会更改。如果c_str()
返回char*
,则该代码段实际上也会导致未定义的行为。