C++中template的.h文件和.cpp文件的问题

在C++中,用到类模板时,如果类似一般的类声明定义一样,把类声明放在.h文件中,而具体的函数定义放在.cpp文件中的话,会发现编译器会报错。如类似下面代码:

//test.h文件
#ifndef TEST_H_
#define TEST_H_

template <class T>
class test
{
private:
    T a;
public:
    test();
};

#endif
//test.cpp文件
#include "test.h"

template <class T>
test<T>::test()
{
    a = 0;
}
//main.cpp文件
#include <iostream>
#include "test.h"
using namespace std;

int main()
{
    test<int> abc;
}

以上代码在编译时会产生如下错误:

Error    2    error LNK1120: 1 unresolved externals
Error    1    error LNK2019: unresolved external symbol "public: __thiscall test<int>::test<int>(void)" (??0?$test@H@@QAE@XZ) referenced in function _main

原因在于,类模版并不是真正的类,它只是告诉编译器一种生成类的方法,编译器在遇到类模版的实例化时,就会按照模版生成相应的类。

在这里就是编译器遇到main函数中的test<int> abc;时就会去生成一个int类型的test类。

而每一个cpp文件是独立编译的,那么如果将类模版的成员函数单独放在一个cpp文件中,编译器便无法确定要根据什么类型来产生相应的类,也就造成了错误。

一般的解决方法就是将类模版中的成员函数定义也写入.h文件中。

posted on 2015-09-24 17:04  caiminfeng  阅读(6309)  评论(0编辑  收藏  举报

导航