2016-07-18 8 views
1

Я хотел бы объявить const unordered_map, но я получаю ошибку компилятора, и я не могу понять правильный синтаксис. Все примеры, которые я нашел, но один из них не const, и я делаю это точно как единственный пример const, который я знаю, но я получаю ошибки компилятора. Вот мой код:Как использовать "const unordered_map"?

typedef const std::unordered_map<std::string,int> StringIntMap; 
StringIntMap string_to_case { 
    {"get",1}, 
    {"add",2} 
}; 

против 110 дает мне:

Error 1 error C2601: 'string_to_case' : local function definitions are illegal 

или если я ставлю знак равенства между string_to_case и кронштейном я получаю:

Error 1 error C2552: 'string_to_case' : non-aggregates cannot be initialized with initializer list 

против 120_CTP_Nov2012 вместо дает меня следующие с или без знака равенства:

error C2440: 'initializing' : cannot convert from 'initializer-list' to 'std::unordered_map<std::string,int,std::hash<_Kty>,std::equal_to<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' 
1>   with 
1>   [ 
1>    _Kty=std::string 
1> ,   _Ty=int 
1>   ] 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 

что я делаю неправильно?

ответ

1

Это работает с GCC 6.1.1:

$ cat t.C 
#include <unordered_map> 
#include <string> 

typedef const std::unordered_map<std::string,int> StringIntMap; 
StringIntMap string_to_case = { 
    {"get",1}, 
    {"add",2} 
}; 
$ g++ -g -c -std=c++1z -o t.o t.C 
$ g++ --version 
g++ (GCC) 6.1.1 20160621 (Red Hat 6.1.1-3) 

Вы не делаете ничего плохого. Вы либо попали в ошибку компилятора, а ваш компилятор не поддерживает последний стандарт C++.

+0

спасибо, но визуальная студия (по крайней мере, у версий, к которым у меня есть доступ, vs2012 update 5 и vs2012 CTP nov 2012), и не принимает ее :( – AbsolutelyFreeWeb

+2

Согласен. Вам нужно VS 15 или лучше (версия компилятора 19). –

+0

Мне понадобится около часа, чтобы установить последнюю версию Fedora Linux в запасную коробку, с gcc 6.1.1 «из коробки». Если вы хотите использовать современный компилятор C++, поддерживающий самые последние стандарты C++, вы должны быть способный решить эту проблему довольно быстро. –