C++错误:'unordered_map'不是一种类型

15

就我所知,我已经正确地做了一切,但我收到了错误的提示信息:

error: 'unordered_map' does not name a type
error: 'mymap' does not name a type

在我的代码中,我有:

#include <unordered_map>

using namespace std;

//global variable
unordered_map<string,int> mymap;
mymap.reserve(7000);

void main {
  return;
}

我不清楚这里可能会缺少什么......

编辑:当我更新我的声明为

std::tr1::unordered_map<string,int> mymap;

我能够解决第一个错误,但是当我尝试进行预留时,我仍然会收到第二个错误消息。

编辑2:如下面所指出的,reserve必须进入主函数,并且我需要使用标志进行编译。

-std=c++0x

然而,仍存在与unordered_map相关的错误,具体包括:

error: 'class std::tr1::unordered_map<std::basic_string<char>, int>' has no member named 'reserve'

提供一个完整的例子。 - Cheers and hth. - Alf
你使用的是哪个版本的编译器?以及你用什么选项编译你的代码?请记住,std::unordered_map 是在 C++11 中可用的。 - Nawaz
g++.exe(在MinGW下的g ++)。gcc版本是4.6.2。那么我是否可以使用unordered_map?当我使用tr1命名空间时,我可以声明我的unordered_map,但是当我尝试保留空间时,仍然会出错。 - user788171
4
在函数或方法定义之外不能调用函数或方法。reserve的调用必须移到main中。 - didierc
3个回答

23

使用 g++ -std=c++11 进行编译(我的 gcc 版本是 gcc 4.7.2)以及

#include <unordered_map>
#include <string>

using namespace std;

//global variable
unordered_map<string,int> mymap;

int main() {
  mymap.reserve(7000); // <-- try putting it here
  return 0;
}

2
对于 GCC 4.6.2,应该使用“-std=c++0x”。 - Jonathan Wakely
@JonathanWakely 谢谢。我忘了提到我的g++版本。 - gongzhitaao
啊,是的,愚蠢的错误,reserve语句必须在main()函数内部,并且我确实需要使用gcc 4.6.2的-std=c++0x标志进行编译。不幸的是,我仍然遇到了一些unordered_map的困难,我得到了以下错误:error: 'class std::tr1::unordered_map<std::basic_string<char>, int>' has no member named 'reserve'。 - user788171
@user788171 请看这里:http://en.cppreference.com/w/cpp/container/unordered_map/reserve。``reserve``方法是c++11中的新方法。所以要么更新你的gcc,要么尝试其他方法 :) - gongzhitaao
解决方案是使用std=c++0x并删除include中的tr1/。 - user788171

6
如果你想在c++11以前的版本中使用,请使用#include,并以以下形式声明你的映射:std :: tr1 :: unordered_map mymap,这将使用技术报告1扩展来实现向后兼容性。

这应该是正确答案...而不是已选择的答案。 - GeekyCoder

3
您不能在全局范围内执行任意表达式,因此您应该将其放入函数中。
mymap.reserve(7000);

主函数内部。

对于其他STL容器,如map和vector,也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接