2014-10-10 115 views
0

所以我目前正在导出一个DLL,我遇到了一个问题,我有一个包含静态char * []成员变量的模板类。我想为这个模板的专门化定义这个。导出/定义静态模板专门的成员变量C++

例如:

MyTemplate.h

#include <dll_defines.h> 

template <typename T> 
class MY_API MyTemplate 
{ 
    public: 
     static char const* m_array[]; 
} 

MySpecializedTemplate.h

#include <dll_defines.h> 
#include <MyTemplate.h> 

class MY_API Specialized; //pretend its more than just a decl. 

template <> char const* MyTemplate<Specialized>::m_array[] = 
{ 
    "Hello, World", 
    "I need help" 
}; 

我遇到的问题是,当我试图在另一个项目中链接DLL,它给了我一个错误说明:

定义dllimport static da ta成员不允许

是否没有办法定义模板的静态数据成员并将其导出到DLL?

+0

你用什么编译器?为什么在头文件中定义静态数据成员? – Constructor 2014-10-10 04:24:32

+0

我正在使用visual studio,所以MSVC。此外,模板必须从我所理解的头文件中定义。我认为模板类中包含的静态数据成员也需要。通常,类的静态数据成员在定义中被初始化为.cpp文件,但我不确定自该模板以来该怎么做。 – 2014-10-10 04:29:13

+0

显式专业化实际上不是模板。所以他们应该只在头文件中声明。 – Constructor 2014-10-10 07:02:47

回答

0

好吧,所以我意识到我实际上可以在实现文件中初始化静态模板变量。我也意识到我不应该将一个导出或导入宏附加到头文件中定义的模板函数中。

DONT DO THIS: 
template <typename T> 
MY_API void foo() 
{ 
    cout << "This won't link, don't try it << endl 
} 

意识到,上面有一个非常不好的问题,一旦MY_API被定义为

__declspec(dllimport)