原则42:了解typename的双重意义

本原则讨论的是typename,这个typename是个啥玩意呢,你经常会在泛型编程中见到如下代码:


原则42:了解typename的双重意义_第1张图片

原则42:了解typename的双重意义_第2张图片

这俩是在一般情况下是等效的,用于声明一个泛型的类型。本原则讨论的是typename的注意事项。
不过在这之前要明确几个概念:1、从属名称;2、嵌套从属名称;3、嵌套从属类型名称。
什么是从属名称?template中出现的名称依赖于某个template参数,比如说泛型类型是T,然后你声明了一个本地变量,它的类型也是T。
什么是嵌套从属名称?比如说泛型中某类型T的容器的迭代器。
什么是嵌套从属类型名称?它首先是一个嵌套从属名称,而且还涉及到某类型。虽然不怎么懂吧,我还是权且记下来。
嵌套从属名称有可能导致解析困难。因为嵌套从属名称的书写形式不可能完全避免和其他同形式的意义不同的表达式区别开来,C++编译器在这方面是有些困难的。这就会造成一种歧义状态,所以为解决此问题C++编译器就默认为嵌套从属名称不是类型名称。
如果你要使用的是一种类型名称,那你就必须显式的告诉C++编译器,它是一种类型名称,此时你就必须在它前面加上关键字typename。所以以后你遇到上述情况一定要加上typename。
但是要注意typename不可以出现在基类继承列表内的嵌套从属名称之前和成员初始化列表中作为基类的修饰符。作者在此举了个例子加以说明:


原则42:了解typename的双重意义_第3张图片

最后作者又举了一个traits class的运用,具体的例子我就不多说了,作者想表达的意思还是你要用typename关键字去告诉编译器那个表达式代表的是一种类型。作者还讲到有时候表达式很长,你可以用typedef为这个表达式起个别名。
最后总结:
1、声明template类型时你使用class和typename是等效的。

2、你要使用typename来修饰嵌套从属类型名称,但是要注意特殊情况。

你可能感兴趣的:(原则42:了解typename的双重意义)