了解 C++ 之 typename

typename与class都可以用作模板形参定义的关键字,两者无异~~

可是,typename的用途并非仅限于此,如下面的代码:

在上述代码中,iter的类型是C::const_iterator,实际的类型取决于C的类型。const_iterator 同时也是C内部的typedef 类型名。 但是,在此处,编译器的行为不会是你预期的。

为了说明这个问题,定义两个概念,一个是从属名称,一个是非从属名称。

在上述代码中,iter 是依赖于模板参数C的,因此被称为从属名称;

同理,value是内置类型,不依赖于任何模板参数,因此被称为 非从属名称。

C++编译器在面对从属名称时,如果此时该从属名称又嵌套了其他类型,如此处的 iter就是C::const_iterator类型,

这里的C::const_iterator 称嵌套从属类型(嵌套于C类型,从属于模板参数C)。编译器在看到这样的代码

时,难免会晕头转向,因为它不知道const_iterator  是C内部定义的类型,还是C内部的成员变量。因此,编译器一致

约定说,对于这样的不负责任的输入,编译器一致将其认为 “这不是个类型”!!显然这就需要在代码中明确地告诉

它,这是个类型,就这样只需要 在 C::const_iterator 前面加上关键字 typename 即可。

这就是必须用到typename的地方。告诉编译器,明确代码的含义,如果觉得很难记住,记住下面这一个例子就可以了:

template <class T>         //可以是class或者是typename,定义模板

void  f( const    C & container  ,   typename C::iterator iter);   //   第一个参数不需要typename,因为它并没有设计嵌套从属类型,它只是个从属类型(因为与C相关), 后面的typename是必须的。

但是,这里似乎有一些恼人的情况,前面提到说,在嵌套从属类型之前,你需要明确的告诉编译器,你需要的是个类型,可是有些

时候,又不能这么做。

比如下面的情况:

1
在类定义的基类列表中出现的嵌套从属类型之前,不能写typename。

2
在成员初值列表中,不能使用typename。

例如下面的例子:

总之:

在template声明时,class与typename是等价的。

typename则用在嵌套从属类型定义时,除了在成员初值列以及基类列表中。

了解 C++ 之 typename,布布扣,bubuko.com

时间: 2024-10-20 08:33:07

了解 C++ 之 typename的相关文章

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

在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于定义类.在模板引入c++后,最初定义模板的方法为: template<class T>...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字.它的作用同class一样表明后面的符号为一个类型,这样在定义

typename在C++中的用法

1. //在C++中typename一般用来声明模板的模板参数(template parameter): template<typename T> class X; //T是一个模板参数 2. /*但是还有一个关键的用法.首先是两个概念: 1). qualified name 例如:std::cout, std::endl;这样含有作用域符号(::)的就是限定名, 当我们用using声明将cout,endl引入到当前作用域之后就可以直接使用 这两个名称,这个时候cout,endl就不是限定名了

[转] C++箴言:理解typename的两个含义

文章转自:C++箴言:理解typename的两个含义 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> class Widget; // uses "class" template<typename T> class Widget; // uses "typename" 答案:没什么不同.在声明一个 template type para

typename与class的区别

我们都知道,在STL中基本上都使用了模板类的声明,即template.在模板类的声明中,我们有两种方式: template <class T> template <typename T> 在这里,class和typename是相同的.也就是说,在声明一个template type parameter(模板类型参数)的时候,class和typename意味着 完全相同的东西. 但是,在C++中,有的时候必须要使用typename.下面我们列举下面一个例子. 关键字typename被用

C++箴言:理解typename的两个含义 nested dependent name(嵌套依赖名字)

template<class T> class Widget; // uses "class"template<typename T> class Widget; // uses "typename" 答案:没什么不同.在声明一个 template type parameter(模板类型参数)的时候,class 和 typename 意味着完全相同的东西.一些程序员更喜欢在所有的时间都用 class,因为它更容易输入.其他人(包括我本人)更喜

c++中typename和class的区别介绍

"typename"是一个C++程序设计语言中的关键字.相当用于泛型编程时是另一术语"class"的同义词.这个关键字用于指出模板声明(或定义)中的非独立名称(dependent names)是类型名,而非变量名. 学习C++的人对class这个关键字都非常明白,class用于定义类.在模板引入c++后,最初定义模板的方法为: template<class T>...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用

C++中的关键字用法---typename

1. typename 关键字 "typename"是一个C++程序设计语言中的关键字.当用于泛型编程时是另一术语"class"的同义词.这个关键字用于指出模板声明(或定义)中的非独立名称(dependent names)是类型名,而非变量名. (1)class关键字的同义词 这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如: 1 // 定义一个返回参数中较大者的通用函数 2 template <typen

c++模板编程-typename与class关键字的区别

最近一直在研究c++模板编程,虽然有些困难,但希望能够坚持下去.今天,在书上看见一个讨论模板编程typename与class两个关键字的区别,觉得挺有意义的,就把它们给总结一下. 先看一个例子: template<typename C> typename C::value_type sum(C &c){ typedef typename C::value_type value_type; typedef typename C::iterator iterator; value_type

typename的用法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 1. //在C++中typename一般用来声明模板的模板参数(template parameter):    template<typename T> class X;   //T是一个模板参数     2. /*但是还有一个关键的