Почему некоторые включаемые файлы находятся только в tr1?

Когда я пытаюсь включить такие вещи, как <unordered_map>, он терпит неудачу и говорит, что файл не существует, а когда я пытаюсь включить <tr1/unordered_map>, он работает. однако найдены включаемые файлы, которые присутствуют также в С++ 03, и являются С++ 11 (например, <vector> имеет конструктор перемещения). Кроме того, заголовки, которые есть только в c++11, а не в tr1, также находятся нормально, например <thread>.
Похоже, что все, что было новым в tr1, было просто брошено в папку tr1, а все остальное включено в обычное.
Почему это происходит? Можно ли как-то это исправить без изменения исходных файлов?
Передача -I/path/to/include/tr1 не сработает, потому что все находится в пространстве имен tr1.
Я использую компилятор:

Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)

person Dani    schedule 24.10.2011    source источник
comment
Думали ли вы, что реализация вашего компилятора/стандартной библиотеки может быть просто неполной?   -  person Nicol Bolas    schedule 24.10.2011
comment
Повторяя @NicolBolas, какую стандартную библиотеку вы используете? Какой номер версии/ревизии?   -  person Michael Price    schedule 24.10.2011
comment
Кроме того, я бы посоветовал пометить здесь компилятор и стандартную библиотеку, которые вы используете, чтобы привлечь более пристальное внимание людей, которые над ними работают.   -  person Michael Price    schedule 24.10.2011


Ответы (3)


TR1 (технический отчет 1) — это не стандарт, а просто отчет. Это официальный способ сообщить людям, что комитет заинтересован в этой области. Любая реализация tr1 является экспериментальной версией, направленной на получение обратной связи с целью улучшения будущего стандарта.

Используя Apple Xcode 4.2, вы можете выбрать почти полную библиотеку С++ 11, выполнив поиск в настройках сборки «libc++», а затем выбрав «libc++» в качестве стандартной библиотеки C++ (это не значение по умолчанию).

Или, если вы предпочитаете командную строку, вы можете -stdlib=libc++.

libc++ не содержит никаких компонентов tr1, но содержит все компоненты C++11, кроме <atomic>.

person Howard Hinnant    schedule 24.10.2011
comment
Спасибо, я думал, что -lc++ это переключатель для новой стандартной библиотеки. с -stdlib=libc++ работает отлично. - person Dani; 24.10.2011

Добавьте оба следующие параметры в clang++:

-std=c++11 -stdlib=libc++ 
person terphi    schedule 21.08.2013
comment
Извините за нуб, как мне добавить эти параметры в clang++? ‹-- настройка macports... - person Beshoy Girgis; 28.10.2013
comment
@BeshoyGirgis Я не знаю о macports. Но обычно из командной строки: clang++ somefile.cpp -std=c++11 -stdlib=libc++ - person terphi; 29.10.2013
comment
+1; это сработало для меня в CMake: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++") - person mpontillo; 26.04.2014

Да, разные компиляторы по-разному обрабатывают заголовки TR1. Например, GCC делает то же самое, что и вы, тогда как MVS принимает <unordered_map>. Один из способов обойти это — использовать boost/tr1/unordered_map.hpp, если вам необходима кроссплатформенная компиляция или компиляция с несколькими компиляторами.

person ahj    schedule 24.10.2011
comment
MVS = Microsoft Visual Studio, я думаю. - person Tomas Andrle; 02.11.2011