2012-01-28 74 views
3

我在家用電腦上編寫了一個使用Visual C++的類的程序,但是,我試圖在學校的Linux計算機上運行它,並且出現了這些錯誤。前 '<' 令牌C++中的unordered_map錯誤?

;

std::tr1::unordered_map <string, Word*> map; 

這兩種錯誤出現在代碼以上

ISO C++禁止 'unordered_map' 的聲明無類型

預期 ''最初我使用hash_map但發現只能在Visual C++中使用

謝謝

回答

3

GCC和MSVC以不同的方式定義TR1擴展,因爲TR1標準對應該如何提供給用戶很模糊。它只是指定應該有一些編譯器選項來激活TR1。

與MSVC不同,GCC將標題置於TR1子目錄中。有兩種訪問方式:

  1. 添加命令行選項-isystem /usr/include/c++/<GCC version>/tr1。這是更符合要求,但似乎會導致問題。
  2. 使用條件編譯:

    #ifdef __GNUC__ 
    #include <tr1/unordered_map> 
    #else 
    #include <unordered_map> 
    #endif 
    

    這暴露了GCC的不合格:TR1不設置選項激活的,而是通過修改代碼。

    圍繞這個有一些有點深奧的方法:計算標題名稱。

    #ifdef __GNUC__ 
    #define TR1_HEADER(x) <tr1/x> 
    #else 
    #define TR1_HEADER(x) <x> 
    #endif 
    
    #include TR1_HEADER(unordered_map) 
    

    這樣,你只需要包括「一次」的東西。

+0

啊,另請參閱http://stackoverflow.com/questions/5952602/using-tr1-libraries-in-gcc-and-msvc。顯然有一個Boost.TR1,但它並不完美。 – Potatoswatter 2012-01-29 00:09:58