这是一个在C ++中使用类模板的简单示例。这段代码有效。
#include <iostream>
using namespace std;
template <class T>
class Test {
public:
Test();
void print();
private:
int i;
};
template <class T>
Test<T>::Test() {
i=1;
cout<<"New instance"<<endl;
}
template <class T>
void Test<T>::print() {
cout<<"Test"<<endl;
}
int main() {
Test<int> i;
i.print();
return 0;
}
所以当我将这段代码分成3个文件时:main.cpp,Test.h,Test.cpp:
//Test.h
#include <iostream>
using namespace std;
template <class T>
class Test {
public:
Test();
void print();
private:
int i;
};
//Test.cpp
#include "Test.h"
template <class T>
Test<T>::Test() {
i=1;
cout<<"New instance"<<endl;
}
template <class T>
void Test<T>::print() {
cout<<"Test"<<endl;
}
//main.cpp
#include "Test.h"
using namespace std;
int main() {
Test<int> i;
i.print();
return 0;
}
我收到错误:
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall Test<int>::print(void)" (?print@?$Test@H@@QAEXXZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Test<int>::Test<int>(void)" (??0?$Test@H@@QAE@XZ) referenced in function _mai
1>C:\Programming\C++\stuff\templass\Debug\templass.exe : fatal error LNK1120: 2 unresolved externals
我使用的是Microsoft Visual C ++ 2010 Express。所以我搜索了很多关于未解决的外部符号但是没有找到这个案例。那我的错是什么?
答案 0 :(得分:1)
无法像任何其他源文件一样编译模板。接口和实现都应该存在于头文件中(尽管有些文件将它们分成.hpp
个文件用于接口和.ipp
文件以供实现,然后在.ipp
文件末尾包含.hpp
文件{1}}文件)。
编译模板类时编译器如何知道要生成哪些类?