C++;-结合typedef和typename的语句的含义 在C++头文件中,我看到这个代码: typedef typename _Mybase::value_type value_type; 现在,正如我所理解的,引用Schildt的“完全引用”。code>typename可以被关键字class替换,typename的第二个用途是通知编译器模板声明中使用的名称是类型名而不是对象名

C++;-结合typedef和typename的语句的含义 在C++头文件中,我看到这个代码: typedef typename _Mybase::value_type value_type; 现在,正如我所理解的,引用Schildt的“完全引用”。code>typename可以被关键字class替换,typename的第二个用途是通知编译器模板声明中使用的名称是类型名而不是对象名,c++,typedef,typename,C++,Typedef,Typename,同样,可以使用关键字typedef定义新的数据类型名称。你不是 实际上是创建一个新的数据类型,而不是为现有数据类型定义一个新名称 类型 但是,您能否准确地解释上面这行代码的含义,其中typedef和typename组合在一起。语句中的“::”意味着什么?typename是说\u Mybase::value\u type是类型的名称,因此typedef可以解释这个事实。typedef定义了一个新类型,用于代码中,就像速记一样 typedef typename _MyBase::value_type

同样,可以使用关键字
typedef
定义新的数据类型名称。你不是 实际上是创建一个新的数据类型,而不是为现有数据类型定义一个新名称 类型


但是,您能否准确地解释上面这行代码的含义,其中
typedef
typename
组合在一起。语句中的“
::
”意味着什么?

typename是说
\u Mybase::value\u type
是类型的名称,因此
typedef
可以解释这个事实。

typedef定义了一个新类型,用于代码中,就像速记一样

typedef typename _MyBase::value_type value_type;
value_type v;
//use v
这里的typename让编译器知道
value\u type
是一个类型,而不是
\u MyBase
的静态成员


是类型的范围。它有点像“在”所以
value\u type
“在”
\u MyBase
中。或者也可以被视为包含。

typename
typedef
内外都有相同的用途。一个更现实的例子是
typedef-typename-std::vector::iterator-Iter天哪,Schildt回来了。现在就把这本书烧掉。读:“这三个无关的C++特征是我在书中没有读到的?”阿文德:不幸的是,许多“事实”是错误的。“类型名称可以被关键字类“LOL,false”替代。令人惊讶的是,Schildt著作中随机引用的一句话常常不正确。如果我不包括它,会有什么变化?它是否未编译,是否缺少一些警告?我以为是A B;在任何情况下都可以正常工作。如果有人能回答@masterxilo的评论,那就太好了,因为我也在想同样的事情。@RastaJedi至少在Visual Studio中,
typename
在这种情况下似乎不是必需的。除非当前定义的类是模板化的,否则将其放入模板中甚至是错误的:
typedefint;模板结构B{typedef typename Int IInt;}很好,但是
typedef int;结构B{typedef typename Int IInt;}不是。这里需要“typename”吗?这取决于上下文。如果_MyBase依赖于模板参数,则不必选择yes(如果_MyBase是模板类型),否则不必选择yes。如果您对上下文感到困惑,编译器将提供一个错误来帮助您。为什么当_MyBase是模板类型时,
typename
是必需的?当_MyBase不是模板类型时,为什么不需要
typename
?@V.Wu松散地说,这是因为编译器在使用(实例化)模板类型之前无法查看模板类型的内部。因此,为了使其成为有效语法,程序员必须澄清value_type是否为类型,即是否为typename(其为成员变量或方法)。