C++模板中的typename的两种用法
2017-08-25 17:34
615 查看
在模板参数中,typename与class的使用是一样,如:
上面两段代码含义是一样的。
typename的第二个作用是用来指定相应名称为类型。
当模板中出现typedef,而typedef的内容还依赖于模板参数时,必须要指定——T::bs是一个类型(而不是一个变量)——如下代码编译器会报错:
于是要在T::bs前面加上typename关键字:
题外:
上述的所谓“依赖于模板参数”,是由于C++模板标准规定了“Two-Phase Name Lookup”,即模板中有两种类型的名称(Name),一种是 “非依赖性名称(Non-dependent names)”,即在模板定义时就能确定的名称;另一种是“依赖性名称(Dependent names)”,即要等到模板实例化时才能确定的名称。如下例:
题外参考:wuye9036/CppTemplateTutorial(第二章)
template<typename T> class A{};
template<class T> class A{};
上面两段代码含义是一样的。
typename的第二个作用是用来指定相应名称为类型。
当模板中出现typedef,而typedef的内容还依赖于模板参数时,必须要指定——T::bs是一个类型(而不是一个变量)——如下代码编译器会报错:
template<typename T> class Temp { public: /*此处将报错,因为编译器不确定T::bs是一个类型还是一个成员变量, 而typedef只能作用于类型。*/ typedef T::bs _bs; };
于是要在T::bs前面加上typename关键字:
template<typename T> class Temp { public: typedef typename T::bs _bs; };
题外:
上述的所谓“依赖于模板参数”,是由于C++模板标准规定了“Two-Phase Name Lookup”,即模板中有两种类型的名称(Name),一种是 “非依赖性名称(Non-dependent names)”,即在模板定义时就能确定的名称;另一种是“依赖性名称(Dependent names)”,即要等到模板实例化时才能确定的名称。如下例:
class A { class B { }; }; template<typename T> class Temp { public: /*A::B是已经确定的名称,不依赖于模板参数T*/ typedef A::B A_B; /*由于模板定义时不知道T::bs是T的成员类型还是成员变量, 其依赖于模板Temp实例化时传入的参数T,所以是依赖性名称, 编译器会强制要求在前面加上typename。*/ typedef typename T::bs T_bs; };
题外参考:wuye9036/CppTemplateTutorial(第二章)
相关文章推荐
- c++模板中的 typename 和 template 关键字用法
- <转>详解C++的模板中typename关键字的用法
- C++ 的模板中 typename 关键字的用法
- 详解C++的模板中typename关键字的用法
- C++模板中关键字typename与class的区别
- C++中operator的两种用法
- typename 的两种用法
- C++模板template用法总结
- C++模板template用法总结
- 读书笔记 effective c++ Item 42 理解typename的两种涵义
- Item 42:typename的两种用法 Effective C++笔记
- 【C++ STL模板之queue队列的用法】
- c/c++调用libcurl库发送http请求的两种基本用法
- C++基础——关于模板的技巧性基础知识(typename、成员模板、模板的模板参数)
- 06 C++中类、函数、成员模板基本用法
- C++中typename的用法
- 使用C++模板判断类型的两种情形
- C++模板template用法总结
- c++的模板用法
- C++模板高级用法