vendredi 22 mai 2015

Templated class cannot access private static member [duplicate]

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