2013-03-31 2 views
13

я делаю все правильно, насколько я могу сказать, и я получил сообщение об ошибке:C++ ошибка: «unordered_map» не называет тип

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; 
} 

Я не вижу, что может быть здесь отсутствует ....

EDIT: когда я обновить мою декларацию

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

Я могу устранить первую ошибку, но когда я пытаюсь зарезервировать, я все равно получаю второе сообщение об ошибке.

EDIT2: Как указано ниже, запас должен идти в основной и мне нужно компилировать с флагом

-std=c++0x 

Тем не менее, по-прежнему являются ошибки, связанные с unordered_map, а именно:

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

Предоставить ** полный ** пример –

+0

Какую версию вы используете? И с какими параметрами вы компилируете свой код? ** Помните, что 'std :: unordered_map' доступен с C++ 11 **. – Nawaz

+0

g ++. Exe (g ++ под MinGW). Версия gcc - 4.6.2. Итак, есть ли способ использовать unordered_map? Когда я использую пространство имен tr1, я могу объявить свой unordered_map, но когда я пытаюсь зарезервировать место, я все равно получаю сообщение об ошибке. – user788171

ответ

13

Compile с 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; 
} 
+1

Для GCC 4.6.2, который должен быть '-std = C++ 0x' –

+0

@JonathanWakely Спасибо. Я забыл упомянуть мою версию g ++ – gongzhitaao

+0

Ах да, глупая ошибка, оператор резервирования должен быть внутри main(), и мне нужно скомпилировать флаг -std = C++ 0x для gcc 4.6.2. К сожалению, у меня возникают некоторые трудности с unordered_map, я получаю: error: 'class std :: tr1 :: unordered_map , int>' не имеет имени с именем 'reserve' – user788171

3

Вы не можете execute arbitrary expressions at global scope, так что вы должны поставить

mymap.reserve(7000); 

внутри основной.

Это справедливо и для других контейнеров STL, таких как карта и вектор.

0

If you want to support <unordered_map> for versions older than c++11 use
#include<tr1/unordered_map> and declare your maps in the form :- std::tr1::unordered_map<type1, type2> mymap
which will use the technical report 1 extension for backward compatibility.

Смежные вопросы