C++类模板的声明和实现不能分离

也许你具有良好的编程习惯,在定义一个类的时候总会把声明和实现分离开,位于不同的文件中。比如你定义一个类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 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/u013049912/article/details/84936161