也许你具有良好的编程习惯,在定义一个类的时候总会把声明和实现分离开,位于不同的文件中。比如你定义一个类A,首先创建一个.h文件,代码如下:
class A
{
public:
A(int b);
void show();
~A();
private:
int a;
}
接下来你创建一个.cpp文件实现类的声明,代码如下:
#include"classA.h"
#include<iostream>
A::A(int b)
{
a = b;
}
void A::show()
{
std::cout << a << std::endl;
}
A::~A()
{
}
接下来就要使用这个类了,新建一个cpp文件,代码如下:
#inlucde"classA.h"
#include<iostream>
int main()
{
A a(10);
a.show();
return 0;
}
可能你和我一样,按照上诉编程习惯来写类模板,这简直就是个遭遇!
将上面的类A改为类模板,.h文件如下:
template<class T>
class A
{
public:
A(T b);
void show();
~A();
private:
T a;
}
把.cpp文件改为如下:
#include"classA.h"
#include<iostream>
template<class T>
A<T>::A<T>(T b)
{
a = b;
}
template<class T>
void A<T>::show()
{
std::cout << a << std::endl;
}
template<class T>
A<T>::~A<T>()
{
}
main函数的.cpp文件代码改为:
#inlucde"classA.h"
#include<iostream>
int main()
{
A<int> a(10);
a.show();
return 0;
}
此时运行,错误发生。如果我们将类模板的声明和定义写在一个文件中呢,即把.h和.cpp文件合并,得到如下代码:
template<class T>
class A
{
public:
A(T b);
void show();
~A();
private:
T a;
}
template<class T>
A<T>::A<T>(T b)
{
a = b;
}
template<class T>
void A<T>::show()
{
std::cout << a << std::endl;
}
template<class T>
A<T>::~A<T>()
{
}
这样在进行调试,则没有错误。
所以,我们得到:
类模板不能将声明和实现分离在两个文件中!!
但是究其原因:
《C++编程思想》中这么说:模板定义很特殊。由template<…>处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。
---------------------
作者:一蓑烟雨1989
来源:CSDN
原文:https://blog.csdn.net/wangshubo1989/article/details/48244435
版权声明:本文为博主原创文章,转载请附上博文链接!