2012-01-28 92 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