C++模板中的朋友与名称解析
1. 模板参数与等价性
1.1 模板模板参数
在声明模板模板参数时,语法上只能使用关键字 class ,但这并不意味着只有用 class 声明的类模板才能作为替换参数。实际上,“结构体模板”和“联合体模板”也可以作为模板模板参数的有效参数,这类似于用 class 声明的模板类型参数可以接受几乎任何类型作为参数。
1.2 模板参数等价性
两组模板参数等价的条件是参数值一一对应相同。对于类型参数, typedef 名称无关紧要,比较的是 typedef 最终底层的类型;对于整数非类型参数,比较的是参数的值,而值的表达方式无关紧要。示例如下:
template <typename T, int I>
class Mix;
typedef int Int;
Mix<int, 3*3>* p1;
Mix<Int, 4+5>* p2;
// p2 has the same type as p1
从函数模板生成的函数与普通函数即使类型和名称相同也不等价,这对类成员有两个重要影响:
1. 从成员函数模板生成的函数不会覆盖虚函数。
2. 从构造函数模板生成的构造函数不是默认复制构造函数(类似地,从赋值模板生成的赋值操作符也不是复制赋值操作符,但由于复制赋值操作符的隐式调用不太常见,所以这个问题不太容易出现)。
超级会员免费看
订阅专栏 解锁全文
11万+

被折叠的 条评论
为什么被折叠?



