clang ++, boost :: spirit и c ++ 11

Я использую clang ++ (clang-421.0.60), упакованный с Xcode 4.6, и столкнулся с проблемой с boost :: spirit. Если я компилирую без каких-либо флагов, все компилируется нормально. Если я компилирую с помощью '-std = c ++ 11', я получаю следующую ошибку (при включении «boost / spirit / include / qi.hpp»):

In file included from test_spirit11.cpp:1:
In file included from /usr/local/include/boost/spirit/include/qi.hpp:16:
In file included from /usr/local/include/boost/spirit/home/qi.hpp:14:
In file included from /usr/local/include/boost/spirit/home/qi/action.hpp:14:
In file included from /usr/local/include/boost/spirit/home/qi/action/action.hpp:21:
/usr/local/include/boost/spirit/home/support/action_dispatch.hpp:21:10: fatal error: 
  'type_traits' file not found

#include <type_traits>

Проблема в том, что используемая по умолчанию библиотека (stdlibc ++) имеет type_traits, определенный как 'tr1 / type_traits', тогда как boost :: spirit ожидает только 'type_traits'. Конечно, я могу решить эту проблему, выполнив:

 clang++ -std=c++11 -stdlib=libc++ <...>

Хотя мне бы хотелось использовать libc ++, с практической точки зрения это сложно (многие библиотеки по-прежнему используют stdlibc ++ и зависят от него). Таким образом, я вынужден не использовать libc ++.

Есть ли у кого-нибудь предложения, как с этим бороться? Я действительно хочу, чтобы либо больше разработчиков библиотеки поддерживали libc ++, либо Apple предоставила более новую версию stdlibc ++. Было большим разочарованием иметь доступ к новым функциям C ++ 11, но не иметь возможности использовать их в полной мере из-за отсутствия поддержки библиотеки.


person Abe Schneider    schedule 31.12.2012    source источник
comment
В качестве временной меры вы можете попробовать добавить -I/path/to/stdlibc++/includes/tr1 к флагам вашего компилятора.   -  person n. 1.8e9-where's-my-share m.    schedule 01.01.2013
comment
@ n.m. это по-прежнему не сработает, заголовок TR1 помещает черты в пространство имен std::tr1   -  person Jonathan Wakely    schedule 01.01.2013


Ответы (2)


Проблема в том, что использовалась библиотека по умолчанию (stdlibc ++)

Это называется libstdc ++

имеет type_traits, определенный как 'tr1 / type_traits', тогда как boost :: spirit ожидает только 'type_traits'.

<tr1/type_traits> - это не одно и то же, это совершенно другой заголовок. boost::spirit требуется заголовок C ++ 11 <type_traits>, который является другим заголовком (хотя они содержат некоторые похожие функции в разных пространствах имен.)

Проблема, вероятно, в том, что вы используете libstdc ++, который поставляется с древней версией Apple GCC (4.2), которая не поддерживает C ++ 11.

Если вы хотите использовать C ++ 11, вам нужно либо использовать clang с libc ++, либо установить более новый GCC, чтобы получить более новый libstdc ++. Apple не будет предоставлять новый GCC по причинам лицензирования, но вы можете установить его самостоятельно и указать Xcode, как искать заголовки и библиотеки.

person Jonathan Wakely    schedule 01.01.2013
comment
Хорошо. Это хорошо знать. Есть ли у вас указания по установке более новых версий библиотек GCC? - person Abe Schneider; 02.01.2013
comment
Вы не можете просто установить новые библиотеки, вам нужно установить сам GCC. Либо получите его от какого-нибудь упаковщика, такого как Macports, либо соберите его самостоятельно, следуя инструкциям на gcc.gnu.org/wiki / InstallingGCC (см. Действительно простой сценарий внизу страницы, не вручную устанавливайте gmp, mpfr и mpc) - person Jonathan Wakely; 02.01.2013
comment
Для протокола, я пошел по пути домашнего пивоварения, который, кажется, работает (apple.stackexchange.com/questions/38222/). - person Abe Schneider; 02.01.2013

Если вы не хотите использовать функции C ++ 11 в boost, вы можете отключить их.
Отредактируйте boost clang.hpp для управления функциями.
Например, чтобы отключить ошибку type_traits файл не найден, вы можете добавить в конец :

#define BOOST_NO_VARIADIC_TEMPLATES
person Sintezzz    schedule 21.08.2013