声明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 = {,,,,};
print2nd(vi); return ;
}

输出:

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

  

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

  1. c++类模板template中的typename使用方法-超级棒

    转载:https://blog.csdn.net/vanturman/article/details/80269081 如有问题请联系我删除: 目录 起因 typename的常见用法 typename ...

  2. 【Template】template中如果包含post方法的form, 要在<form>之后添加{% csrf_token %}标签

    template模板标签{% csrf_token %} 和CSRF middleware提供了易于使用的防“跨站点伪造攻击”的保护, 详情请阅读官方文档https://docs.djangoproj ...

  3. vue 在模板template中变量和字符串拼接

    例子:  :post-action="'/api/v1/reportPage/'+this.selectedPagerId+'/saveimg/'"

  4. 六、修改 IntelliJ IDEA 模板注释中的 user 内容

    咱们进一步了解了 IntelliJ IDEA 的个性化设置功能,包括主题和字体的常用设置等,修改后,具体的效果,如下图所示: 观察上图,不知道大家有没有注意到:IntelliJ IDEA 自带模板注释 ...

  5. C++中模板函数或模板类中关键词class和typename

    ##区别 基本上来说,class和typename几乎没有区别.在可以使用class的地方都可以使用typename,在使用typename的地方也几乎可以使用class. 可以看出我加黑了两个子:几 ...

  6. C++中 模板Template的使用

    1.在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?答:class用于定义类,在模板引入c++后,最初定义模板的方法 ...

  7. C++中模板Template的使用

    1. 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?class用于定义类,在模板引入c++后,最初定义模板的方法为 ...

  8. <转>详解C++的模板中typename关键字的用法

    用处1, 用在模板定义里, 标明其后的模板参数是类型参数. 例如: template<typename T, typename Y> T foo(const T& t, const ...

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

    织梦)dede模板中广告的去除方法1.我们先删除头部的广告,找到templetsdefault下的head.htm文件,打开后找到<div>{dede:myad name=’innerTo ...

随机推荐

  1. 转:xdebug在linux下的安装教程

    原文:xdebug在linux下的安装教程 [注意,本人是PHP7.1.7 Nginx ,第7步没有做,但是xdebug.so就已经在PHP的扩展文件夹里面了.目录是phpinfo的extension ...

  2. axTOCControl右键

    private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) { if (e. ...

  3. CSS 几款比较常用的翻转特效

    第一个:360度翻转特效 <style>* { margin:0; padding:0; } .aa { width: 220px; height: 220px; margin: 0 au ...

  4. 自定义标签+阻尼动画+圆角图片+titleBar随滑动渐隐和显示

    写这个小Demo,也是因为刚好手里没什么事然后看到很多朋友还在好奇这个阻尼界面效果,还有自定义标签,其实这个标签因为现在Google已经有推出更好使用的东西可以替代,那就是“FlexboxLayout ...

  5. 用flutter写一个精美的登录页面

    先看效果图: 源代码已上传到github 我们先看一下页面 , 首先这个页面,我们并没有用到AppBar,当然也就没有自带返回功能.然后下面有个Login的文字以及一条横线. 屏幕中上方是填写帐号以及 ...

  6. idea 导入Mapper错误报错设置

    这个报错如图: 其实这个报错是错误,因为运行一切正常. 解决办法:

  7. 软工读书笔记 week 8 —— 《疯狂的程序员》

    这次接着上一次的进度继续阅读,并将其中感悟较深的几点记录如下.      程序员是一个幕后工作者 书中绝影给医院写软件,而医生(用户)只是评价这个软件好不好用,而不会去评价写这个软件的程序员优不优秀. ...

  8. 【涨姿势】Prince2和PMP的区别,大多数人都没搞清楚!

    项目管理领域有2个流行的知识体系:      ☑ 一个是美国项目管理协会(PMI)开发的“项目管理知识体系(PMBOK,Project Management Body of Knowledge)”,目 ...

  9. Oracle EBS 获取公司段的本位币

    SELECT gls.currency_code FROM hr_organization_information_v t, gl_sets_of_books gls WHERE t.org_info ...

  10. npm install时报错“Unexpected end of JSON input while parsing near...”解决方法

    执行:npm cache clean --force 即可解决此问题