1、类模板、类模板中含有成员模板
首先看例子:
test.h文件
#ifndef TEST_H
#define TEST_H
//定义类模板基类,还是普通类的成员模板?
template<typename T>
class baseclass {
public:
baseclass(){};
~baseclass(){};
void setA(T n);
T getA();
template<typename TT> void print(TT n);
public:
T a;
};
#endif//TEST_H
test.cpp文件
#include "stdafx.h"
#include "test.h"
#include<iostream>
using namespace std;
template<typename T>
template<typename TT>
void baseclass<T>::print(TT n)
{
cout << "类模板的成员模板:" << n << endl;
}
template<typename T>
void baseclass<T>::setA(T n)
{
a = n;
}
template<typename T>
T baseclass<T>::getA()
{
return a;
}
main.cpp文件(实现类模板对象)
#include "stdafx.h"
#include<iostream>
#include "test.h"
#include<string>
#include "test.cpp"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
baseclass<int> base1;
base1.setA(10);
cout << base1.a << endl;
cout << base1.getA() << endl;
base1.print(10);
baseclass<string> base2;
base2.setA("hello");
cout << base2.getA() << endl;
base2.print(1000);//访问类模板的成员模板,不用特地去显示的指出成员模板类型,会自己识别
base2.print("world");
return 0;
}
在main.cpp中如果不include"test.cpp"会报错:
error LNK2019: 无法解析的外部符号 "public: void __thiscall baseclass<int>::setA(int)" (?setA@?$baseclass@H@@QAEXH@Z),该符号在函数 _wmain 中被引用 F:\ProjectBackup\VS2016Project\0511\0511\0511.obj 0511
据说还有种解决方法是添加进虚拟目录(还不知道什么意思……)
2、类模板的继承和派生
假设继承基类baseclass,在派生类的继承列表中一定要指定基类的类模板类型
class derivedclass : public baseclass<int>{
public:
derivedclass(int size):size(size){};
~derivedclass(){};
void setb(int b)
{
this->b = b;
}
private:
int b;
const int size;
};
实例化这样的派生类,语法与一般派生类无差。