千家信息网

c++模板中class与typename的示例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章将为大家详细讲解有关c++模板中class与typename的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。模板中使用class和typename的
千家信息网最后更新 2026年11月01日c++模板中class与typename的示例分析

这篇文章将为大家详细讲解有关c++模板中class与typename的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

模板中使用class和typename的区别

还没翻几页,当看到这段代码的时候就楞了一下。印象中上次也是看到这里一下子没弄懂,还特地搜索过的。结果再来一遍的时候还是忘了。果然好记性不如烂笔头,赶紧写篇博客mark一下。

这里讲的是作者在声明模板的时候使用typename而不是class。一般情况下,使用typename或者class只是编码风格的问题。但是在遇到从属类型(dependent type)的时候,为了避免潜在的预防解析二义性,必须用typename而不能用class。

templatebool lastGreaterThanFirst(const C& container){ if(container.empty()) return false; typename C::const_iterator begin(container.begin()); typename C::const_iterator end(container.end()); return *--end > *begin;}

这里的重点是这两行:

typename C::const_iterator begin(container.begin());typename C::const_iterator end(container.end());

如果没有用typename关键字

templatebool lastGreaterThanFirst(const C& container){ if(container.empty()) return false; C::const_iterator begin(container.begin()); C::const_iterator end(container.end()); return *--end > *begin;}

就会报错(《Effective STL》中指出有些编译器错误的接受了没有typename的代码,但这样的代码是不可移植的):

test.cpp:6:2: error: missing 'typename' prior to dependent type name 'C::const_iterator' C::const_iterator begin(container.begin()); ^~~~~~~~~~~~~~~~~ typenametest.cpp:7:2: error: missing 'typename' prior to dependent type name 'C::const_iterator' C::const_iterator end(container.end()); ^~~~~~~~~~~~~~~~~ typename2 errors generated.

如果你在这里使用的是class而不是typename就会报错:

test.cpp:8:11: error: elaborated type refers to a typedef class C::const_iterator begin(container.begin());   ^test.cpp:15:2: note: in instantiation of function template specialization 'lastGreaterThanFirst > >' requested here lastGreaterThanFirst(vec); ^/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:476:54: note: declared here typedef __wrap_iter  const_iterator;       ^1 error generated.

为什么出现从属类型时需要用typename

我们一步一步来解析。

ClassA::foo

当你看到上面的代码的时候,你会觉得foo是什么?第一反应应该是ClassA的一个静态成员变量对吧?

那当你继续往后看,看到下面的代码的时候,想想a是什么?

ClassA::foo a;

a是一个ClassA::foo类型的变量,ClassA::foo是一个内部类:

class ClassA {public: class foo { };};

或者ClassA内部的一个typedef:

class ClassA {public: typedef int foo;};

当foo是ClassA的内部类或者是内部的一个typedef的时候,foo就是一个从属类型。

而对于C::const_iterator,const_iterator可能是C的一个静态成员变量或者是C的一个从属类型,编译器默认是将它解析为一个变量的,所以需要用typename告诉编译器这是一个类型:

typename C::const_iterator begin(container.begin());

出现从属类型时不需要用typename的特例

在遇到从属类型出现在类模板定义中的基类列表的时候,是不需要用typename关键字指明这是一个类型的:

class ClassA {public: class foo { };};templateclass ClassB : public C::foo {};

因为基类列表中的肯定是一个类型。

关于"c++模板中class与typename的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

类型 时候 从属 模板 代码 变量 篇文章 编译器 编译 示例 c++ 分析 关键 关键字 成员 更多 这是 静态 面的 会报 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 电子科技大学互联网 奔汉互联网科技 赫美联合互联网科技 上海卓越科技 互联网 北京华百购互联网科技有限公司 华服互联网科技官网 互联网还是高科技吗 世界互联网科技公司市值排名 互联网科技产业特征 迪庆互联网科技招生 深圳市罗太互联网科技有限公司 徐州市互联网科技有限公司 群盈汇互联网科技有限公司 合肥互联网科技公司公章图片 南通创西澳互联网科技有限公司 国产互联网科技公司 中国新注册互联网科技 湖北辰鑫科技互联网 东风日产互联网科技公司叫什么 六子台科技互联网展会 互联网科技公司简介 广州百单互联网科技有限公司 新华互联网科技学校 互联网科技的发展 伴你行互联网科技有限公司 互联网高科技股票 广州燕处互联网科技有限公司 易企秀互联网科技是做什么的 信承诺互联网科技有限公司 广东猫王互联网科技有限公司电话
0