1

我有以下类和模板函数:

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<5>(class String<5> &,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);

现在你建议我应该如何进行实例化,因为我肯定不会为地球上找到的每一个整数都这样做!!!。

4

3 回答 3

4

如果它是一个您希望能够为任意参数实例化的函数模板,那么不要将它放在您的源文件中。而是将其放在头文件中。

强制性链接:

于 2010-11-09T08:47:10.617 回答
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);
于 2010-11-09T13:33:51.507 回答
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';
}
于 2010-11-09T09:04:08.703 回答