2016-07-18 15 views
1

Ich möchte eine const unordered_map deklarieren, aber ich bekomme einen Compiler-Fehler, und ich kann nicht die richtige Syntax herausfinden. Alle Beispiele, die ich gefunden habe, außer einem sind nicht const, und ich mache es genau wie das einzige const Beispiel, das ich kenne, aber ich erhalte Compilerfehler. Hier ist mein Code:Wie benutzt man "const unordered_map"?

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

vs 110 gibt mir:

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

oder wenn ich ein Gleichheitszeichen zwischen string_to_case setzen und die Halterung ich:

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

vs 120_CTP_Nov2012 stattdessen gibt mir folgendes mit oder ohne Gleichheitszeichen:

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 

Was mache ich falsch?

Antwort

1

Dies funktioniert mit 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) 

Sie nichts falsch machen. Sie treffen entweder einen Compiler-Fehler, Ihr Compiler unterstützt nicht den neuesten C++ - Standard.

+0

danke, aber Visual Studio (mindestens die Versionen, die ich zugreifen, vs2012 Update 5 und vs2012 CTP nov 2012), akzeptiert weder es :( – AbsolutelyFreeWeb

+2

Vereinbarte. Sie benötigen VS 15 oder besser (Compiler-Version 19). –

+0

Es dauert ungefähr eine Stunde, um die neueste Version von Fedora Linux auf einer Ersatz-Box zu installieren, mit gcc 6.1.1 "out of the box". Wenn Sie einen modernen C++ - Compiler verwenden möchten, sollten Sie die neuesten C++ - Standards unterstützen –