转载:模板(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;
}

输出:

2

例外:嵌套从属类型名称, 如果是基类列表(base class list)和成员初值列(member initialization list)中,不使用typename;

代码:

/*
* 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;
}

输出:

Number = 5
Number = 7

当使用特性类(traits class)时, 必须使用typename, 如

代码:

/*
* 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;
}

输出:

temp = 1

时间: 2024-10-12 13:43:27

转载:模板(template)中typename的使用方法的相关文章

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

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

【转载】机器学习中的相似性度量,方法汇总对比

机器学习中的相似性度量,方法汇总对比 人工智能  林  1周前 (01-10)  876℃  0评论 作者:苍梧 在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的“距离”(Distance).采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否. 本文的目的就是对常用的相似性度量作一个总结. 本文目录: 1. 欧氏距离 2. 曼哈顿距离 3. 切比雪夫距离 4. 闵可夫斯基距离 5. 标准化欧氏距离 6. 马

【转载】Java中String类的方法及说明

转载自:http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String : 字符串类型 一.构造函数     String(byte[ ] bytes):通过byte数组构造字符串对象.     String(char[ ] value):通过char数组构造字符串对象.     String(Sting original):构造一个original的副本.即:拷贝一个original.     String(Strin

【转载】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模板中使用函数的方法

【转载】Python中如何高效实现两个字典合并,三种方法比较。

本文转载自:http://www.pythoner.com/13.html Python中将两个字典进行合并操作,是一个比较常见的问题.本文将介绍几种实现两个字典合并的方案,并对其进行比较. 对于这个问题,比较直观的想法是将两个字典做相加操作,赋值给结果字典,其代码为: 方法一: dictMerged1 = dict( dict1.items() + dict2.items() ) 然而,该方法合并时所用时间较长,效率更高的代码为: 方法二: dictMerged2 = dict( dict1,

转载:WinForm中播放声音的三种方法

转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753094 声音文件folder.wav放置在bin目录下debug下 1.通过API调用 using System.Runtime.InteropServices; [DllImport("winmm.dll")] public static extern bool PlaySound(st