2009-08-04 2 views
28

У разных компиляторов, похоже, есть разные идеи о TR1. G ++ кажется только принять включает типа:Как включить TR1?

#include <tr1/unordered_map> 
#include <tr1/memory> 
... 

Хотя Microsofts компилятор только принимает:

#include <unordered_map> 
#include <memory> 
... 

Как ибо, как я понимаю, TR1, как Microsoft является правильным.

Есть ли способ заставить G ++ принять вторую версию? Как вообще можно управлять TR1 портативным способом?

+5

TR1 на самом деле не является частью стандарта C++, поэтому «правильный» способ включения этих нестандартных файлов заголовков должен быть спорным. – 2009-08-04 16:28:43

ответ

16

Установите boost на свою машину.
Добавьте следующий каталог в свой путь поиска.

< подталкивания Установить каталог >/увеличить/TR1/tr1

посмотреть здесь boost tr1 подробности

Теперь, когда вы включаете < память > вы получите версию tr1 памяти, которая имеет станд :: tr1 :: shared_ptr, а затем он включает в себя версию для платформы < памяти >, чтобы получить все нормальные лакомства.

+1

+1. Поскольку TR1, похоже, «позволяет импортировать эти классы повышения в стандарт» – KitsuneYMG

+0

Я делаю '#include" boost/tr1/unordered_map.hpp ", и он использует реализацию tr1, если он доступен. –

4

Возможно, лучшим способом было бы просто использовать библиотеки boost, так как во многих случаях у них есть альтернативы с аналогичным интерфейсом с функциями TR1, и они просто находятся в другом (но последовательном) пути и пространстве имен. Это имеет то преимущество, что работает над компиляторами, у которых даже не началось , реализующее C++ 0x. И есть много полезных библиотек boost, которые вообще не находятся в TR1 :)

В качестве альтернативы, в G ++ вы можете попробовать передать --std = gnu ++ 0x в командной строке. Это работает для < unordered_set> и < unordered_map>, по крайней мере. Затем, чтобы сделать его доступным в std :: tr1:

namespace std { namespace tr1 { using namespace std; } } 

Это зло, естественно. Я настоятельно рекомендую подход с повышением. :)

+0

Использование -std = C++ 0x или -std = gnu ++ 0x не работает, так как он будет делать только std :: unordered_set <>, но не std :: tr1 :: unordered_set <>. – Grumbel

+0

@ Grumbel, обновленный злым взломом, который сделает его доступным в std :: tr1 – bdonlan

3

Возможно, это был довольно хаккий, но вы могли просто добавить каталог компилятора tr1 в свой путь include.

2

Если под Windows добавьте каталог 'tr1' в системный путь. Тогда #include <memory> должен работать.

+0

ли компиляторы на окнах используют системный путь, а также путь включения при разрешении? –

+0

Нет, они этого не делают. – 2009-08-04 16:27:57

2

Я задал себе тот же вопрос. К сожалению, в техническом отчете не указано, как следует включать заголовки. Он определяет только, что расширения должны быть в пространстве имен :: std :: tr1.

12
#ifdef _WIN32 
    #include <unordered_map> 
    #include <memory> 
#else 
    #include <tr1/unordered_map> 
    #include <trl/memory> 
#endif 
+0

Возможно, вы должны основывать условную компиляцию на компиляторе, а не на платформе (' _WIN64' является реальным): '#if defined (_MSC_VER) && (_MSC_VER> 1300) ', например. – IInspectable

+0

В последнем случае включить tr1 с ошибкой как trL;) –