C++ - meaning of a statement combining typedef and typename
在C++头文件中,我看到了这个代码:
1
| typedef typename _Mybase::value_type value_type; |
现在,据我所知,引述自?C++的完整引用?席尔德。typename可以用关键字类替换,typename的第二个用法是通知编译器模板声明中使用的名称是类型名而不是对象名。
同样,您可以使用关键字typedef定义新的数据类型名称。你不是实际创建新的数据类型,而不是为现有的类型。
但是,您能准确地解释一下上述代码行的含义吗,其中typedef和typename组合在一起。声明中的"EDOCX1"〔5〕意味着什么?
- typename在typedef的内部和外部具有相同的用途。一个更现实的例子可能是typedef typename std::vector::iterator Iter;。
- @chris mybase::value_type和value_type分别代表什么,以及"mybase::value_type value_type"代表什么?
- 天哪,希尔德回来了。立刻烧掉那本书。
- @Arvind在遇到模板时,您不知道基本类型是什么。你所指的语句是一种语言机制,用来告诉编译器"这东西一旦被使用,实际上就是一个类型名。"(我不能相信赫比·希尔特还在写。上次我查过,你只能在国会图书馆找到他的书。
- @arvind,::表示它嵌套在_Mybase中。typedef和typename是两个独立的问题,其中一个在这方面回答得很好。
- 克里斯——你是对的,但是史莱特确实有一个用途——它是一个C++的事实百科全书——不是教书,而是枯燥的事实,就像一个枯燥的历史课。:)
- 读:"我在书中没有读到的这三个无关的C++特征是什么?"
- @阿尔文:不幸的是,许多"事实"都是错误的。
- "typename可以用关键字class"lol,false替换。令人惊讶的是,Schildt作品中的一段随机引语经常出现错误。
- @是的,如果你想到一个关于罗马人如何与成吉思汗争夺美洲控制权的历史课。
- @在一个简单的模板分解上下文中,r.martinhofernandes typename可以被类替换,即template可以被template
- @pippin1289,但不是手头的情况。
- @皮平1289我知道。它并没有改变这样一个事实,即文本误导了你认为它在这个特定的上下文中是可替换的。注意它是如何在一个单独的句子和逗号滥用引导。(我假设我们的询问者报价正确)
- @克里斯是的,确实,我只是在向行动组澄清,以便他能得到一个完整的理解。
- 与using value_type = typename _Mybase::value_type;相同
typedef正在定义一个新类型,以便在代码中使用,就像一个速记。
1 2 3
| typedef typename _MyBase::value_type value_type;
value_type v;
//use v |
这里的typename让编译器知道value_type是一个类型,而不是_MyBase内部的对象。
::是该类型的范围。有点像"在"中,所以value_type在"_MyBase"中。或者也可以被认为是包含物。
- 这里需要'typename'吗?
- 这取决于上下文。如果MyBase依赖于模板参数而不是Yes(如果MyBase是模板类型),则不必如此。如果您对上下文感到困惑,编译器会给出一个错误来帮助您。
typename表示_Mybase::value_type是类型的名称,因此typedef可以根据这一事实来解释。
- 如果我不包括它,会有什么变化?它是否未编译,是否缺少一些警告?我认为typedef a b;在所有情况下都可以正常工作。
- 如果有人能回答@masterxilo的评论,那就太好了,因为我只是在想同样的事情。
- @至少在Visual Studio中,typename在这种情况下似乎不是必需的。如果不将您当前定义的类模板化,那么这样做甚至是错误的:typedef int Int; template struct B { typedef typename Int IInt; };是好的,但typedef int Int; struct B { typedef typename Int IInt; };不是。