在DLL中使用模板时链接器错误

时间:2014-09-06 23:12:54

标签: c++ templates visual-c++ dll linker

假设我正在编写DLL库。该库包含单个模板和一个类。

// Enum.h (Template part of library)
template <typename Type> class Enum
{
private:
    Enum (void); // User implemented
    static std::map<const char*, Type> mMap;

public:
    static int size() { return 0; }
};

// Misc.h (Class part of library)
enum MiscEnum { M1, M2, M3, M4 };
struct LIB_EXPORT Misc { Misc(); };

// Misc.cc (Impl)

// **Errors Below**
std::map<const char*, MiscEnum> Enum<MiscEnum>::mMap;
Enum<MiscEnum>::Enum()
{
    mMap["M1"] = M1;
    mMap["M2"] = M2;
    mMap["M3"] = M3;
    mMap["M4"] = M4;
}
// **Errors Above**

Misc::Misc()
{
    std::cout << Enum<MiscEnum>::Size() << std::endl;
}

// Main.cc (App using library)
enum MainEnum { E1, E2, E3 };

std::map<const char*, MainEnum> Enum<MainEnum>::mMap;
Enum<MainEnum>::Enum()
{
    mMap["E1"] = E1;
    mMap["E2"] = E2;
    mMap["E3"] = E3;
}

void main()
{
    std::cout << Enum<MiscEnum>::Size() << std::endl;
    std::cout << Enum<MainEnum>::Size() << std::endl;
}

在库中使用Enum时出现链接器错误。我理解这个问题,并且某处需要有一个LIB_EXPORT类型的声明,但我不太确定在哪里。

0 个答案:

没有答案