关于编译报错 error: cannot convert ‘const std::__cxx11::basic_string’ to ‘const char*’ 的处理
所以然
目前c++11标准开始普及,大家都开始默认支持或者使用c++11,例如GCC 5就开始默认启用C++11特性。但是由于c++11相对于c++03,很多实现的数据结构都发生了改变,所以两者并不能完全混用。
默认情况下,GCC 5在编译时会将std::string类型按c++11下std::__cxx11::basic_string<char>
来处理,这时如果你调用的库在编译时未启用c++11特性则其中的std::string实际上是std::basic_string<char>
,这时如果将c++11下的string当作参数传入非c++11的库时,就会出现error: cannot convert 'const std::__cxx11::basic_string<char>' to 'const char*'
,或者未定义的方法引用(undefined reference)。
所以解决这个问题/类似问题的根本方法就是在编译时不要混用c++11和c++03库/代码。
然
如果你是在GCC5下使用了非GCC5编译的库,或者编译时关闭了c++11特性的库,那么在编译你的代码时请相应的关闭C++11特性:
- 0x01 编译选项中预定义宏
-D_GLIBCXX_USE_CXX11_ABI=0
- 0x02 代码中定义宏
#define _GLIBCXX_USE_CXX11_ABI 0
- 0x03 通过其他方法定义
_GLIBCXX_USE_CXX11_ABI
宏的值为0
例如Qt中可以在Pro文件中添加:
DEFINES += _GLIBCXX_USE_CXX11_ABI=0