关于类模板和模板类得区分问题:
个人认为主要是针对于翻译的相关问题:即 class template 和 template class的相关问题;
class template“类模板”主要是针对于参数化的类模板描述,即最初的某个类类型的模板定义;
template class“模板类”主要是针对于模板实例化的类,即对某个模板进行实例化的结果,抑或是具有template-id的类;
函数模板/模板函数,成员函数模板/模板成员函数的关系也类似于此;
关于模板特化的问题:
之前对模板特化有一个误解,一直以为其是针对于模板实例化而进行特化,直到看到书上的描述很疑惑,上网检索才知道是其实是针对于模板类的重载。
例如,对于全特化,有下述形式:
#include<iostream> #include<stdlib.h> #include<string> using namespace std; template <typename T, typename U> class myclass { public: T a; U b; myclass(T v, U u) :a(v), b(u) {}; void output() { cout << "this is orgin template" << endl; } }; template <> class myclass<string, float> { public: string a; float b; myclass(string v, float u) :a(v), b(u) {}; void output() { cout << "this is special template" << endl; } }; int main() { string a = "213"; myclass<string,float> m(a, 5.5); m.output(); myclass<int, int> n(1, 1); n.output(); system("pause"); return 0; }
从上述描述可以看出来,针对于myclass不同参数类型,output()生成的结果是不一样的;
因此,特化可以看作是针对于类模板的一种重载,不同的模板参数形式可以有不同的定义;
关于模板参数、模板实参、template-id的问题:
模板参数:即模板定义尖括号给出的类型,如下图所示;
模板实参:即实际使用时候给出的类型,template-id指的就是所有的模板实参;