C++类模板

来源:互联网 发布:电脑修复软件 编辑:程序博客网 时间:2024/06/05 17:09

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.obj0511

据说还有种解决方法是添加进虚拟目录(还不知道什么意思……)

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;};
实例化这样的派生类,语法与一般派生类无差。