我有以下课程和模板功能:
template <size_t num>
class String{
public:
char charArray[num];
};
template <size_t num,typename T>
void getString(String<num> & string,T number){
cout <<string.charArray<<' '<<number<<'\n';
}
然后我尝试进行一个显式的实例化,如下所示将该实例化导出到DLL但最后发现它根本没有实例化,因为我在地方的链接器遇到了未解析的外部符号的链接器错误即将导入和使用该功能(确切的链接器错误:“未解析的外部符号”__declspec(dllimport)
void _ cdecl getString&lt; 5&gt;(类String&lt; 5&gt;&amp ;, unsigned char)( _imp _ ?? $ getString @ $ 04 @@ YAXAAV?$ String @ $ 04 @@ E @ Z)“)因为在我想要实例化的那一点没有指定”num“;首先我想的可能是因为String<num> & string
将被实现为指针,以下语法将是一个实例化但似乎我错了。
template<size_t num>
__declspec(dllexport) void getString(String<num> & string,unsigned char number);
现在你怎么建议我应该进行实例化,因为我不一定要为地球上发现的每一个整数做这个!!!。
答案 0 :(得分:4)
如果它是一个您希望能够为任意参数实例化的函数模板,那么请不要将它放在源文件中。把它放在头文件中。
强制性链接:
答案 1 :(得分:1)
它是什么,从一开始就是一个错误的设计,我所做的并不是一个明确的实例化,因为即使对于“size_t num”的不同值,函数的不同实例也会与我的想法相反首先,这种设计不可能实现我的预期显式实例化。对于正确的设计,函数的第一个参数应该是一个数组,以使“typename T”的不同类型的显式实例化成为可能。正确的设计如下:
template <typename T>
void getString(char string[],T number){
cout <<string<<' '<<number<<'\n';
}
template __declspec(dllexport) void getString(char string[],unsigned char number);
答案 2 :(得分:0)
在标题声明中:
template <size_t num,typename T>
void getString(String<num> & string,T number);
在你的cpp文件中定义:
template <>
void getString<42,int>(String<42,int> & string, int number){
cout <<string.charArray<<' '<<number<<'\n';
}