Преобразование std:: cxx11:: string в std:: string
Я использую c++11, но также некоторые библиотеки, которые не настроены для него, и нуждаются в некотором преобразовании типа. В частности мне нужен способ конвертировать std::__cxx11::string
обычных std::string
, но погуглив я не могу найти способ сделать это и положить (string)
спереди не работает.
если я не конвертирую я получаю ошибки компоновщика, как это:
undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const'
4 ответа:
возможно ли, что вы используете GCC 5?
Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std::__cxx11 или теге [abi:cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать вместе объектные файлы, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при связывании со сторонней библиотекой, которая была скомпилирована с более старой версией GCC. Если третья сторона библиотека не может быть перестроена с новым ABI, то вам нужно будет перекомпилировать код со старым ABI.
источник: примечания к выпуску GCC 5 / Dual ABI
определение следующего макроса до включая любые стандартные заголовки библиотеки должны решить вашу проблему:
#define _GLIBCXX_USE_CXX11_ABI 0
Если вы можете перекомпилировать все несовместимые библиотеки, которые вы используете, сделайте это с параметром компилятора
- D_GLIBCXX_USE_CXX11_ABI=1
а затем перестроить свой проект. Если вы не можете этого сделать, Добавьте в свой проект параметр компилятора makefile
-D_GLIBCXX_USE_CXX11_ABI=0
определение
#define _GLIBCXX_USE_CXX11_ABI 0/1
также хорошо, но вам, вероятно, нужно добавить его в все ваши файлы в то время как опция компилятора делает это для всех файлов сразу.