This question already has an answer here:
Playing around with enumclass-to-string converter for understanding templates. According to my knowledge - there are should be separate classes generated for each enum, so, code should work. But I have problem, regarding unordered_map.
Header:
template <typename T>
class strEnum {
public:
static T getEnum(std::string str) {
if (map.find(str) == map.end()) {
throw std::exception("error");
}
return map.at(str);
}
static void insert(T enumClass, std::string str) {
map.emplace(str, enumClass);
}
private:
static std::unordered_map<std::string, T> map;
};
.cpp:
enum class enumClass {
enum1, enum2, enum3
}
void main() {
strEnum<enumClass>::insert(enumClass::enum1, "enum1");
auto x = strEnum<enumClass>::getEnum("enum1");
}
It's failing with error on MSVC 2013.
error LNK2001: unresolved external symbol "private: static class std::unordered_map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,enum ivan,struct std::hash<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::equal_to<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,enum ivan> > > strEnum<enum ivan>::map" (?map@?$strEnum@W4ivan@@@@0V?$unordered_map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@W4ivan@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@W4ivan@@@std@@@2@@std@@A)
D:\Coding\_Projects\enumString\Debug\enumString.exe : fatal error LNK1120: 1 unresolved externals
Looks like I should somehow initialize this static unordered_map, like usual static variable, but I have no idea how. Deep explanations are very welcome.
Aucun commentaire:
Enregistrer un commentaire