typename的作用
一、与class的区别
template声明式中,class和typename这两个关键字意义完全相同
template<class T> class Widget;
template<typename T> class Widget;
二、什么时候要用typename?比如下面的代码
template <typename C>
void print2nd(const C& container)
{
if (container.size() >= 2)
{
C::const_iterator iter(container.begin());
++iter;
int value = *iter;
std::cout << value;
}
}
关键的地方在于C::const_iterator这个到底是什么?是类中的一个静态成员变量还是类中的嵌套从属名称?这取决于模板的参数C
这里的iterator就是嵌套从属名称
template <class T>
class test
{
vector <T> xx;
typename vector <T> ::iterator Iterator ; <=====这里必须加typename
};
在这里因为在编译期无法知道T是什么,也就无法确定iterator是否为某种类型,为了告诉编译器它是一种类型,必须在前面添加typename
三、嵌套从属名称可能导致解析的困难
template <typename C>
void print2nd(const C& container)
{
C::const_iterator* x;
}
这里有可能让编译误导是参数C中的某个静态成员变量与变量x作相乘,所以这里必须在前面添加typename
四、不该使用typename的地方
1、typename只用来验明嵌套从属类型名称;其他名称不该有它存在。
template <typename C>
void f(const C& container, //不允许使用typename
typename C::iterator iter);//一定要使用typename
2、“typename必须作为嵌套从属类型名称的前缀词”这一规则的例外是,typename不可以出现在base classes list内的嵌套从属类型名称之前,也不可在member initialization list(成员初始化列表)中作为base class修饰符。
template <typename T>
class Derived: public Base<T>::Nested{//base class list中不允许“typename”
public:
explicit Derived(int x)
:Base<T>::Nested(x)//mem.init.list中不允许“typename”
{
typename Base<T>::Nested temp;//嵌套从属类型既不在base class list中也不在mem.init.list中,
} //作为一个base class修饰符需加上typename
};
五、typename的使用例子
让我们看一个typename例子:一个function template,他接受一个迭代器,而我们打算为该迭代器指涉的对象做一份复件temp:
template <typename IterT>
void workWithIterator(IterT)
{
typename std::iterator_traits<IterT>::value_type temp(*iter);
}
也可以这么写,可以少打几个typedef typename std::iterator_traits<IterT>::value_type
template <typename IterT>
void workWithIterator(IterT)
{
typedef typename std::iterator_traits<IterT>::value_type value_type;
value_type temp(*iter);
typename的作用相关推荐
- typedef typename的作用
很多文章写的很长,讲了一大堆的东西不知道干什么,看得云里雾里的.简单的概念被搞复杂了. 重点: typedef 后面加一个typename的作用就是明确告诉编译器后面定义的类里面有这个类型,让它不要报 ...
- C++ STL中常见的typename关键字的作用
在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于 ...
- C++ typedef typename 作用
C typedef typename 作用 vectorsize_type 为什么使用typename关键字 总结 C++ typedef typename 作用 C++的一些语法让人看着费解,其中就 ...
- 转载模板声明中template typename T和template class T
原文地址http://blog.csdn.net/bug07250432/article/details/10150625 在c++Template中很多地方都用到了typename与class这两个 ...
- class与typename的异同
一.class与typename的相同点 typename关键字常用于函数模板,这里首先引入函数模板的概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特 ...
- C++模板元编程(7)typename的其他用法
在c++ Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用 ...
- [Reprint]c++中typename和class的区别介绍
在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用 ...
- [搬运][根源出处不知]c++ typename
typename 一.前言 在 C++ 模板函数的使用过程中,我们经常可以看到一个 typename 的使用,例如这样的操作: template <typename T> DataPr ...
- C++中typename用法
typename用法: 1.在c++模板中,用于类型参数化的关键字 2.内嵌.依赖类型名 注:C++11中, typename用于指明紧跟其后的是个类型 1. 在C++中typename一般用来声明模 ...
最新文章
- 多个单例模式单例模式的应用
- 最强Android教程!2021年Android面经分享,大厂面经合集
- 【详谈 Delta Lake 】系列技术专题 之 特性(Features)
- 职业生涯中最致命的十二中想法
- [转] Understanding and Solving Internet Explorer Leak Patterns
- [译]Flask教程--Cookie
- Rust: codewars的Bleatrix Trotter
- 皮尔逊相关系数和斯皮尔曼相关系数
- java POI excel导出自定义分页问题
- LEGION: Visually compare modeling techniques for regression
- 月薪不过万郑州程序员的真实生活
- word表格复制到excel回车换行问题 1
- RuntimeError: stack expects each tensor to be equal size
- 【MMDetection3D】MVXNet踩坑笔记
- 用 Windows 的 diskpart 命令修复U盘
- 杭电LCY-ACM算法入门习题(01-04)
- 主持工作的副职能享受正职的办公室面积待遇吗?
- 基于java网上订餐网站系统
- 示波器的作用及使用方法
- 论文阅读笔记——A deep tree-based model for software defect prediction
热门文章
- 设计模式之四(抽象工厂模式第二回合)
- 如何成为“10倍效率”开发者
- 后端DTO(数据传输对象)与DAO(数据库数据源对象)解耦的好处
- mysql数据库访问编程,mysql 连接数据库
- c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...
- 如何确定autosar的版本_AUTOSAR编码指南(中文版)
- latex公式对齐_Word 写公式最方便的方法
- zabbix 安装_安装zabbix
- 如何使用notepad运行python程序
- azkaban的操作指南