模板函数需要将声明和实现放到同一个文件中
//templateTest.h
#ifndef TEMPLATE_TEST_H_H
#define TEMPLATE_TEST_H_H
bool IsEqual(int i1, int i2);
template<typename Type_>
bool IsEqualEx(Type_& t1, Type_& t2);
class MyClass
{
public:
MyClass();
void InitCount();
int GetCount();
void PushNode1(char c);
template<typename Type_>
void PushNode2(Type_& node){ ++m_count; }
template<typename Type_>
void PushNode3(Type_& node);
private:
int m_count;
};
#endif//TEMPLATE_TEST_H_H
//templateTest.cpp
#include "templateTest.h"
bool IsEqual(int i1, int i2){ return i1 == i2 ? true : false; }
template<typename Type_>
bool IsEqualEx(Type_& t1, Type_& t2){ return t1 == t2 ? true : false; }
MyClass::MyClass() :m_count(0){}
void MyClass::InitCount(){ m_count = 0; }
int MyClass::GetCount(){ return m_count; }
void MyClass::PushNode1(char c){ ++m_count; }
template<typename Type_> void MyClass::PushNode3(Type_& node){ ++m_count; }
//main.cpp
#include "templateTest.h"
int main()
{
int num1 = 3;
int num2 = 5;
IsEqual(num1, num2);//编译成功
IsEqualEx(num1, num2);//编译失败
//error LNK2019: unresolved external symbol "bool __cdecl IsEqualEx<int>(int &,int &)" (??$IsEqualEx@H@@YA_NAAH0@Z) referenced in function _main
MyClass theCls;
theCls.InitCount();//编译成功
theCls.GetCount();//编译成功
theCls.PushNode1('x');//编译成功
theCls.PushNode2(num1);//编译成功
theCls.PushNode3(num1);//编译失败
// error LNK2019: unresolved external symbol "public: void __thiscall MyClass::PushNode3<int>(int &)" (??$PushNode3@H@MyClass@@QAEXAAH@Z) referenced in function _main
return 0;
}
//所以说,模板函数的定义和声明要放在同一个.h文件中,如果分成.h和.cpp来放,会链接失败。
完。