天天看点

关于编译报错 error: cannot convert 'const std::__cxx11::basic_string<char>' to 'const char*' 的处理关于编译报错 error: cannot convert ‘const std::__cxx11::basic_string’ to ‘const char*’ 的处理

关于编译报错 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 编译选项中预定义宏
  • 0x02 代码中定义宏
  • 0x03 通过其他方法定义

    _GLIBCXX_USE_CXX11_ABI

    宏的值为0

    例如Qt中可以在Pro文件中添加:

继续阅读