我正在开发一个静态库,该库有多个类模板和函数模板。我了解为了使用静态库中的模板,所有内容(声明/定义)都需要在头文件中。但是,在这种特殊情况下,因为我知道专业化类型,我认为我可以使用前向声明专业化。
这个技巧与类模板(及其函数)配合得很好,我可以使用我的应用程序代码中的所有库函数。但是,一旦我在库中引入免费函数模板并尝试使用我的应用程序代码中的免费模板函数,它就会给我链接器错误:
错误 LNK2019:函数 _main 1>C:\src\cpp 中引用的未解析的外部符号“class TemplatedStaticLib __cdecl HelpingRegistration(int)”(??$HelpingRegistration@H@@YA?AV?$TemplatedStaticLib@H@@H@Z) \vs2008\StaticLibExample\MathFuncsLib\Debug\TemplatedStaticLibApp.exe : 致命错误 LNK1120: 1 unresolved externals" 我正在使用 VS2008,这是代码
//静态库头文件(.h)
#ifndef _TEMPLATED_STATIC_LIB_
#define _TEMPLATED_STATIC_LIB_
#include <iostream>
template<typename T>
class TemplatedStaticLib
{
public:
TemplatedStaticLib(){};
~TemplatedStaticLib(){};
void print(T t);
};
template<typename T>
TemplatedStaticLib<T> HelpingRegistration(T);
#endif
//静态库类文件(.cpp)
#include "TemplatedStaticLib.h"
//Specialization
template class TemplatedStaticLib<double>;
template class TemplatedStaticLib<int>;
template class TemplatedStaticLib<std::string>;
template<typename T>
void TemplatedStaticLib<T>::print(T t)
{
std::cout << "Templated Print " << typeid(t).name() << std::endl;
}
void HelpingRegistration(void)
{
}
//Specialization of free function
template<> TemplatedStaticLib<int> HelpingRegistration<int>(int);
template<> TemplatedStaticLib<double> HelpingRegistration<double>(double);
template<> TemplatedStaticLib<std::string> HelpingRegistration<std::string>(std::string);
template<typename T>
TemplatedStaticLib<T> HelpingRegistration(T t)
{
std::cout << "Function Templated Print " << typeid(t).name() << std::endl;
return t;
}
//应用代码
#include "TemplatedStaticLib.h"
int main(int argc, char* argv[])
{
int anInt = 99;
TemplatedStaticLib<int> test;
test.print(anInt);//works
double aDouble = 3.9;
TemplatedStaticLib<double> double_test;
double_test.print(aDouble); //works
std::string aString = "James";
TemplatedStaticLib<std::string> string_test;
string_test.print(aString);//works
//The following lines gives linker error
HelpingRegistration(anInt);
HelpingRegistration(aDouble);
HelpingRegistration(aString);
return 0;
}
我不确定为什么会有所不同以及如何解决此问题。任何帮助表示赞赏。