C++中模板类的声明和实现分离问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Raptor_2017/article/details/77689009

有两种方法
第1种:使用 .tpp 文件实现类模板的接口与实现的文件分离
在.h文件中放接口,在.tpp文件中放实现,但这种方法得在.h文件中,类的定义下面通过#include包含”.tpp”文件,如下:

//testTemplateClass.h文件:放类模板的接口

#pragma once
template<typename T>
class templateClass {
public:
    templateClass(const T& a) :data(a) {}
    void print();//需实现的方法
private:
    T data;
};

#include "testTemplateClass.tpp"//包含.tpp文件
/**
(其实,在这种情况下,实现文件:testTemplateClass.tpp文件,不一定要取这个名字,可以随便取个名字,如: abc.t、 xyz.f等都可以,上述一行代码的实际作用就是直接将代码包含进去.h文件中)
*/

//testTemplateClass.cpp文件:放实现

template <typename T>
void templateClass<T>::print() {
    std::cout << "data: " << data << std::endl;
}

//main.cpp文件:测试

#include<iostream>
#include"testTemplateClass.h"

int main(int argc, char **argv) {
    templateClass<int> a(3);
    a.print();//输出 data: 3
    templateClass<double> b(-3.1);
    b.print();//输出 data: -3.1
    std::cin.get();
    return 0;
}

第2种:使用显式声明实现类模板的接口与实现的文件分离
在.h文件中放接口,在.cpp文件中放实现,然后在该.cpp文件中显式的声明要使用的模板类实例,如下:

//testTemplateClass.h文件:放类模板的接口

#pragma once
template<typename T>
class templateClass {
public:
    templateClass(const T& a) :data(a) {}
    void print();
private:
    T data;
};
//注意,使用这种方式,不需要通过#include来包含实现文件

//testTemplateClass.cpp文件:放实现

#include"testTemplateClass.h"
#include<iostream>

template <typename T>
void templateClass<T>::print() {
    std::cout << "data: " << data << std::endl;
}

template class templateClass<int>;//显式的声明要使用的类模板的实例
template class templateClass<double>;//显式的声明要使用的类模板实例
/**
(如果main.cpp文件中需要用到 TemplateClass<char>,那么只需要在testTemplateClass.cpp文件中添加一行代码:template class templateClass<char>;)
*/

//main.cpp文件:测试

#include<iostream>
#include"testTemplateClass.h"

int main(int argc, char **argv) {
    templateClass<int> a(3);
    a.print();//输出 data: 3
    templateClass<double> b(-3.1);
    b.print();//输出 data: -3.1
    std::cin.get();
    return 0;
}

展开阅读全文

没有更多推荐了,返回首页