template类的typename详解--龙之介《Effective C++》实验室
条款typename的双重定义
声明关键字class和typename可互换
假设你这样声明一个迭代器 C::const_iterator iter(container.begin());
这将不是一个有效的c++代码。
因为 C::const_iterator如果不是一个类型呢?如果C 有个成员变量恰好命名为const_iterator。如果他碰巧是个全局变量呢?
当然这听上去有点疯狂,但确实是有可能的,而撰写c++解析器的人必须操心所有可能的输入,包括这么疯狂的输入
如果你想在template中指涉一个嵌套从属类型名称,就必须在紧邻它的前一个位置放上关键字typename
下面是代码环节:
#include <iostream>
#include<vector>
using namespace std;
/*
template<typename C>
void print2nd(const C& container)
{if (container.size() >= 2){typename C::const_iterator iter(container.begin());++iter;int value = *iter;cout << value;}
}
*/
template<class C>
void print2nd(const C& container)
{if (container.size() >= 2){class C::const_iterator iter(container.begin());++iter;int value = *iter;cout << value;}
}int main()
{vector<int> res;res.push_back(1);res.push_back(2);print2nd(res);return 0;
}
运行结果:
但有一例外,typename不可以出现在base classes list内的嵌套从属类型名称之前。
也不能在成员初值列中
其他都可以
#include <iostream>
#include<vector>
using namespace std;template<typename T>
class MyNested
{public:MyNested(T x) :value(x) { cout << value << endl; }T value;
};
template<typename T>
class Base
{public:typedef MyNested<T> Nested;
}; template<typename T>
class Dervied:public Base<typename T>::Nested
{public:explicit Dervied(int x) : Base<T>::Nested(x){typename Base<T>::Nested temp(5);}
private:};int main()
{Dervied<int> d(7);return 0;
}
运行结果:
最后
当使用特性类(traits class)时, 必须使用typename, 如
#include <vector>
#include <iostream>using namespace std;template<typename T>
void workWithIter(T iter) {typedef typename std::iterator_traits<T>::value_type value_type; //使用typenamevalue_type temp(*iter);std::cout << "temp = " << temp << std::endl;}int main() {vector<int> ai = { 1,2,3,4,5 };vector<int>::iterator aiIter = ai.begin();workWithIter(aiIter);return 0;
}
运行结果:
template类的typename详解--龙之介《Effective C++》实验室相关推荐
- C++typename详解
C++typename详解 typename的常见用法 类作用域 完整例子 剖析源码 STL底层源码有下面几行,typedef与typename联用,这几个看着好复杂,究竟啥意思,我们今天一起来剖析! ...
- 对python3中pathlib库的Path类的使用详解
原文连接 https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...
- c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
- python3库_对python3中pathlib库的Path类的使用详解
用了很久的os.path,今天发现竟然还有这么好用的库,记录下来以便使用. 1.调用库 from pathlib import 2.创建Path对象 p = Path('D:/python/1.py' ...
- UML类图与类的关系详解
UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...
- 1.8 Collections类操作集合详解——排序,查找,复制
Collections类操作集合详解 Collections 类是 Java 提供的一个操作 Set.List 和 Map 等集合的工具类. Collections 类提供了许多操作集合的静态方法,借 ...
- python面向对象编程的三大特性_Python面向对象总结及类与正则表达式详解
Python3 面向对象 -------------------------------------------------------------------------------- 一丶面向对象 ...
- java 重启线程_java 可重启线程及线程池类的设计(详解)
了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...
- spring MVC请求处理类注解属性详解
spring MVC请求处理类注解属性详解
最新文章
- 地图样式自定义_干货在线 | ArcGIS中定义图框样式
- C#复制、粘贴文本信息到剪贴板
- 「我要出轨了」!伯克利的这个AI,可以预测机器人何时将脱离
- 汇编:从键盘读取字符
- 如何使用schematics快速创建全新的SAP Spartacus Storefront并启用SSR
- SAP Spartacus里的product carousel控件的实现cx-product-carousel
- 多线程 java 实例_Java多线程实例学习
- mysql处理时间_MYSQL时间处理 (转)
- 阿里云:助力数字经济新基建,打造物联网安全基石
- MapReduce 示例:减少 Hadoop MapReduce 中的侧连接
- 微机笔记3——汇编语言程序设计
- html退出登录_退出登录 0152
- 2022 年“苹果学者”名单公布,4 位华人学生位列其中
- TensorFlow人工智能入门教程之十一 最强网络DLSTM 双向长短期记忆网络(阿里小AI实现)...
- linux常用命令整理1
- pyspark--dataframe使用
- Hive 连接 HBase 错误处理
- Python下载Wyoming怀俄明大学探空数据(数据网址更新)
- 微信小程序云开发如何修改后台手动添加的数据
- java basic认证_HTTP Basic auth认证