本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

经验:声明 template 參数时,前缀keyword class 和 typename 可互换。

请使用keyword typename 标识嵌套从属类型名称;

演示样例1:

template<typename C>
void print2nd(const C &container){
C::const_iterator *x;//歧义。假设const_iterator是个static成员变量,x是个global 变量,这里的 *就是乘
//...
}

演示样例2:

template<typename C>
void print2nd(const C &container){
if(container.size() >= 2){
C::const_iterator iter(container.begin());//这个名称被如果为非类型
}
}

解析:如果解析器在template中遭遇一个嵌套从属名称。它便如果这名称不是个类型。所以上面的演示样例不是有效C++代码



纠正:使用keyword typename 标识嵌套从属类型名称

template<typename C>
void print2nd(const C &container){
if(container.size() >= 2){
typename C::const_iterator iter(container.begin());
}
}

经验:不得在 base class list 或 member initialization list(成员初值列)内以 typename 作为 base class 修饰符

演示样例:

template<typename T>
class Derived: public Base<T>::Nested{ //事实上我认为,用 typename 是为了让编译器知道嵌套从属类型名称是类型,而这里能用来继承的当然仅仅能是类型了,所以就不用 typename 了
public:
explicit Derived(int x): Base<T>::Nested(x) // mem.init.list中不同意"typename"
{
typename Base<T>::Nested temp; //这里须要 typename
}
};

Effective C++ Item 42 了解 typename 的双重意义的更多相关文章

  1. 读书笔记 effective c++ Item 42 理解typename的两种意义

    1. class和typename意义相同的例子 问题:在下面的模板声明中class和typename的区别是什么? template<class T> class Widget; // ...

  2. 读书笔记 effective c++ Item 42 理解typename的两种涵义

    1. class和typename含义相同的例子 问题:在下面的模板声明中class和typename的区别是什么? template<class T> class Widget; // ...

  3. 读书笔记_Effective_C++_条款四十二:了解typename的双重意义

    顾名思义,typename有双重含意.只要你用过template,那么第一重含意一定知道,那就是声明模板的时候,我们既可以这样写: template <class T> 也可以这样写 te ...

  4. Effective C++ -----条款42:了解typename的双重意义

    声明template参数时,前缀关键字class和typename可互换. 请使用关键字typename标识嵌套从属类型名称:但不得在base class lists(基类列)或member init ...

  5. 【42】了解typename的双重意义

    1.在template声明中,class与typename是等价的,但是使用typename更好. 2.在template实现中,模版形参是从属名称,嵌套在模版形参中的类型是嵌套从属名称,不依赖任何t ...

  6. [EffectiveC++]item42:了解typename的双重意义

  7. 条款42:了解typename的双重含义

    typename在很多种情况下与class是完全相同的,例如下面的使用: templame<typename T> ...... template<class T> ..... ...

  8. 读书笔记 effective c++ Item 38 通过组合(composition)为 “has-a”或者“is-implemented-in-terms-of”建模

    1. 什么是组合(composition)? 组合(composition)是一种类型之间的关系,这种关系当一种类型的对象包含另外一种类型的对象时就会产生.举个例子: class Address { ...

  9. 读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”

    智能指针的行为像是指针,但是没有提供加的功能.例如,Item 13中解释了如何使用标准auto_ptr和tr1::shared_ptr指针在正确的时间自动删除堆上的资源.STL容器中的迭代器基本上都是 ...

随机推荐

  1. The 6 inspectors in XCode

    Name Shortcut Key Description file helper Command + Option + 1 shows you all the file details relate ...

  2. JAVA中MD5加密实现

    MD5加密实现  结 package com.pb; import java.io.UnsupportedEncodingException; import java.security.Message ...

  3. JSP的页面连接和提交方式(web基础学习笔记六)

    一.GET请求新页面 1.1.超链接请求新页面 <!-- 超链接到page2 --> <a href="page2.jsp">链接到page2</a& ...

  4. C语言的角落——C之很常使用特性(一)

    本文搜集整理了一些之前博客中没有提到的,C语言不经常使用的特性,算是对C系列的最后一次补充. 对C语言有兴趣的朋友能够浏览一下,查漏补缺. 变长參数列表 <stdarg.h> 头文件定义了 ...

  5. AFN同步异步请求

    异步请求: -(BOOL)getOnlyKey1 { NSString *myUUIDStr = [[[UIDevice currentDevice] identifierForVendor] UUI ...

  6. Linux下设置和查看环境变量(转)

    Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 设置变量 ...

  7. 【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  8. hdoj-1251-统计难题【map】

    统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Submiss ...

  9. Tomcat 错误代号集

    收集了一些常见的tomcat 错误代号以及附上状态代码  状态信息  含义.希望对大家有帮助. 状态代码  状态信息  含义100  Continue  初始的请求已经接受,客户应当继续发送请求的其余 ...

  10. Java开源内容管理CMS系统J4CMS集成到JTM

    JTM是Win32下绿色免费的JDK + Tomcat + MySQL环境集成工具. 通过JTM用户无需对JDK.Tomcat.MySQL进行不论什么安装和配置就可以迅速搭建支持JSP + MySQL ...