C++ - 模板(template)中typename的使用方法

声明template参数时, 前缀关键字class和typename可以互换;

使用关键字typename标识嵌套从属类型名称,
但不需在基类列表和成员初始化列表内使用.

从属名称(dependent
names):
 模板(template)内出现的名称, 相依于某个模板(template)参数, 如T
t;

嵌套从属名称(nested dependent
names):
从属名称在class内呈嵌套装, 如T::const_iterator ci;

非从属名称(non-dependent
names):
 不依赖任何template参数的名称, 如int value;

如果不特定指出typename, 嵌套从属名称,
有可能产生解析(parse)歧义.

任何时候在模板(template)中指涉一个嵌套从属类型名称, 需要在前一个位置,
添加关键字typename;

否则报错(GCC): error: need ‘typename‘ before ‘T::xxx‘
because ‘T‘ is a dependent scope

代码:


/*
* BInsertSort.cpp
*
* Created on: 2014.4.17.
* Author: Spike
*/

#include <iostream>
#include <string>
#include <vector>

using namespace std;

template<typename T>
void print2nd(const T& container) {
typename T::const_iterator iter(container.begin()); //未加typename, 报错
++iter;
int value = *iter;
std::cout << value;
}

int main () {
vector<int> vi = {1,2,3,4,5};
print2nd(vi);

return 0;
}

输出:

?





1

2

例外:嵌套从属类型名称, 如果是基类列表(base
class list)
成员初值列(member initialization
list)
中,不使用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

/*

 * BInsertSort.cpp

 *

 *  Created on: 2014.4.17

 *      Author: Spike

 */

#include <iostream>

#include <vector>

using
namespace std;

struct
Number {

    Number(int
x) {

        std::cout << "Number = "
<< x << std::endl;

    }

};

template<typename
T>

struct
Base{

    typedef
Number Nested;

};

template<typename
T>

class
Derived: public
Base<T>::Nested { //不用typename

public:

    explicit
Derived(int
x) : Base<T>::Nested(x) { //不用typename

        typename
Base<T>::Nested temp(7); //必须使用

    }

};

int
main () {

    Derived<int> d(5);

    return
0;

}

?





1

2

输出:<br>Number = 5

Number = 7

当使用特性类(traits class)时, 必须使用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

/*

 * BInsertSort.cpp

 *

 *  Created on: 2014.4.17

 *      Author: Spike

 */

#include <array>

#include <iostream>

using
namespace std;

template<typename
T>

void
workWithIter(T iter) {

    typedef
typename std::iterator_traits<T>::value_type value_type; //使用typename

    value_type temp(*iter);

    std::cout << "temp = "
<< temp << std::endl;

}

int
main () {

    std::array<int, 5> ai = {1,2,3,4,5};

    std::array<int, 5>::iterator aiIter = ai.begin();

    workWithIter(aiIter);

    return
0;

}

  输出:

?





1

temp = 1

  

时间: 2024-08-08 09:40:29

C++ - 模板(template)中typename的使用方法的相关文章

转载:模板(template)中typename的使用方法

声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent names): 模板(template)内出现的名称, 相依于某个模板(template)参数, 如T t; 嵌套从属名称(nested dependent names):从属名称在class内呈嵌套装, 如T::const_iterator ci; 非从属名称(non-dependent nam

【转载】C++中的模板template &lt;typename T&gt;

从一位大佬的程序中看到的,好像挺牛的!! 这个是C++中的模板..template<typename T> 这个是定义模板的固定格式,规定了的..模板应该可以理解到它的意思吧.. 比如你想求2个intfloat 或double型变量的值,只需要定义这么一个函数就可以了,假如不用模板的话,你就必须针对每种类型都定义一个sum函数..int sum(int, int);float sum(float, float);double sum(double, double); 1.因为T是一个模版实例化

C++中 模板Template的使用

1.在c++Template中非常多地方都用到了typename与class这两个关键字,并且好像能够替换,是不是这两个关键字全然一样呢? 答:class用于定义类,在模板引入c++后,最初定义模板的方法为:template,这里class关键字表明T是一个类型.后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字.它的作用同class一样表明后面的符号为一个类型.这样在定义模板的时候就能够使用以下的方式了: template.在模板定义语法中关键字cl

织梦dede模板中广告的去除方法?

织梦)dede模板中广告的去除方法1.我们先删除头部的广告,找到templetsdefault下的head.htm文件,打开后找到<div>{dede:myad name=’innerTopBanner1′/}</div><div>{dede:myad name=’innerTopBanner2′/}</div>删除保存,在返回找到index.htm文件下同样的代码删除保存即可,这样在主页和内容也头部的广告都被删除了dede模板中广告的去除方法 2.下面再删

thinkphp模板中使用函数的方法

1.执行函数并输出返回值:格式:{:function(-)} 例如,输出U函数的返回值: {:U('User/insert')} 编译后的PHP代码是 <?php echo U('User/insert');?> 2.执行函数但不输出 : 格式:{~function(-)} 例如,调用say_hello函数: {~say_hello('ThinkPHP')} 编译后的PHP代码是: <?php say_hello('ThinkPHP');?> thinkphp模板中使用函数的方法

ecshop在dwt模板中和lbi中输入数组详情的方法 ecshop模板中输出数组的方法

ecshop系统的模板是基于smarty开发的,所以语法有很多smarty的特性,但是又不尽相同. 在ecshop的模板文件中(包含.dwt和.lbi的文件),想要用print_r打印一个数组(smarty的语法是{$array|print_r})却发现不行,在模板中始终只是出现一个array,无法打印出数组中的内容.随着ecshop的发展,现在市面上ecshop的商业模板越来越多,免费模板也是来越多,这时候买别人的模板,放在商城中就很担心被加入后门了,所以ecshop就在模板类中屏蔽了所有的函

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

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

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

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

C++中typename和class的区别

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