深入模板基础

1、模板编译

模板是在调用处进行模板参数的自动匹配才会进行编译的。所以调用多个类型的模板参数,就会有多份实例的。而如果没有任何调用,则不会编译该模板代码。

模板如果按照普通cpp,h文件进行部署会出现编译错误。因为编译期间,cpp是不知道该实例化哪个类型,而调用处编译时不会去内联(模板函数不是inline),编译处发现头文件有定义,则认为可以编译过,但是链接时就会发现找不到实现,链接失败了。

1.1 包含模型。优先使用该类型

在.h末尾加上include "xxx.cpp"或在头文件中直接实现模板代码。建议将实现后的.h命名为.hpp

1.2 显示实例化

template int max(int, int); 显示int去实例化模板函数,这样就算没有调用,编译器也会对其进行实例化的

template class Stack<int>; 显示实例化类

这种方法会使得代码难以维护

1.3 分离模型

export关键字,但是并非所有编译器都支持

2、模板限制

2.1类模板不能和另一个实体共享名称

int C;

class C; 合法

template<typename T> class C;非法了

2.2 模板不能具有C链接

extern "c" template<typename T> T max(T a, T b); //非法

2.3 模板类型不能用于修饰名称

template<typename T>

class MyClass

{

friend class T; //非法,不能用class修饰

class T* pT; // 非法

}

2.4 允许试图创建无效类型

template<int N> int g{return N;}

template<int *p>int g{return *p:}

g(1);编译器试图创建第二个时,会发现1是无法取地址给p的,故会使用第一个。这种重载也是合法的,编译器能够匹配上。

2.5 类型实参

局部的类型和局部枚举是不允许作为模板实参的

未命名的enum和class是不能用作实参的

2.6 友元

class MyClass

{

friend class Friend1; // 合法的,即使此处Firend2不可见也是合法的

firend class Friend2<T>; // 如果此处Friend2不可见,则是不合法的

}




你可能感兴趣的:(深入模板基础)