一、与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的作用相关推荐

  1. typedef typename的作用

    很多文章写的很长,讲了一大堆的东西不知道干什么,看得云里雾里的.简单的概念被搞复杂了. 重点: typedef 后面加一个typename的作用就是明确告诉编译器后面定义的类里面有这个类型,让它不要报 ...

  2. C++ STL中常见的typename关键字的作用

    在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于 ...

  3. C++ typedef typename 作用

    C typedef typename 作用 vectorsize_type 为什么使用typename关键字 总结 C++ typedef typename 作用 C++的一些语法让人看着费解,其中就 ...

  4. 转载模板声明中template typename T和template class T

    原文地址http://blog.csdn.net/bug07250432/article/details/10150625 在c++Template中很多地方都用到了typename与class这两个 ...

  5. class与typename的异同

    一.class与typename的相同点 typename关键字常用于函数模板,这里首先引入函数模板的概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特 ...

  6. C++模板元编程(7)typename的其他用法

    在c++ Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用 ...

  7. [Reprint]c++中typename和class的区别介绍

    在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用 ...

  8. [搬运][根源出处不知]c++ typename

    typename 一.前言   在 C++ 模板函数的使用过程中,我们经常可以看到一个 typename 的使用,例如这样的操作: template <typename T> DataPr ...

  9. C++中typename用法

    typename用法: 1.在c++模板中,用于类型参数化的关键字 2.内嵌.依赖类型名 注:C++11中, typename用于指明紧跟其后的是个类型 1. 在C++中typename一般用来声明模 ...

最新文章

  1. 多个单例模式单例模式的应用
  2. 最强Android教程!2021年Android面经分享,大厂面经合集
  3. 【详谈 Delta Lake 】系列技术专题 之 特性(Features)
  4. 职业生涯中最致命的十二中想法
  5. [转] Understanding and Solving Internet Explorer Leak Patterns
  6. [译]Flask教程--Cookie
  7. Rust: codewars的Bleatrix Trotter
  8. 皮尔逊相关系数和斯皮尔曼相关系数
  9. java POI excel导出自定义分页问题
  10. LEGION: Visually compare modeling techniques for regression
  11. 月薪不过万郑州程序员的真实生活
  12. word表格复制到excel回车换行问题 1
  13. RuntimeError: stack expects each tensor to be equal size
  14. 【MMDetection3D】MVXNet踩坑笔记
  15. 用 Windows 的 diskpart 命令修复U盘
  16. 杭电LCY-ACM算法入门习题(01-04)
  17. 主持工作的副职能享受正职的办公室面积待遇吗?
  18. 基于java网上订餐网站系统
  19. 示波器的作用及使用方法
  20. 论文阅读笔记——A deep tree-based model for software defect prediction

热门文章

  1. 设计模式之四(抽象工厂模式第二回合)
  2. 如何成为“10倍效率”开发者
  3. 后端DTO(数据传输对象)与DAO(数据库数据源对象)解耦的好处
  4. mysql数据库访问编程,mysql 连接数据库
  5. c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...
  6. 如何确定autosar的版本_AUTOSAR编码指南(中文版)
  7. latex公式对齐_Word 写公式最方便的方法
  8. zabbix 安装_安装zabbix
  9. 如何使用notepad运行python程序
  10. azkaban的操作指南