class A;
这是class declaration
template<class>class B;
这也是class declaration
class C
{
int i;
public:
void test();
};
这是class definition
其中void test()是member function declaration
template<class T>
class D
{
T i;
public:
void test();
};
这也是class definition
其中void test()也是member function declaration
void C::test(){}
这是member function definition
template<class T>
void D<T>::test(){}
这也是member function definition
非class template的class(如A与C)
会将member function的declaration与definition分开
declaration放在.h
definition放在.cpp
而class template的class(如B与D)
有2种做法(第3种是export,但把这东西忘了吧)
一种是把member function的declaration与definition放在一起
例如
//.hpp or .hxx or anything but not .h
template<class T>
class E
{
T i;
public:
void test(){}
};
然后为了说明这不是一般的.h档案,所以会把这档案取成别的名字
常见的有.hpp或.hxx或干脆没有副档名(如iostream)
所以这时候,就不需再有一个.cpp档案了
另一种做法是按照传统,把member function的declaration与definition分开
但是在.h档案(或.hpp或其他的)里面include该member function definition的档案
例如
//.h
template<class T>
class F
{
T i;
public:
void test();
};
#include"your/member/function/definition/file.cpp"
//.cpp
template<class T>
void F<T>::test(){}
然而你的方法却是include .cpp(然后里面在include .h)
不是不能这么做
只是当别人要用你的档案时,他会以为只要include .h就好
然后就发现compile不过,之后才知道原来你用的方式跟别人不一样
我以前都用第二种做法,但后来发现用第一种做法比较好
(用第二种容易让别人搞混,以为compile时也要把.cpp放进去,结果就error了)
还有,你给的那连结,我看一眼就关掉了
连main function都写不好的网志,没有看的必要