typedef中typename的用法与继承 只是想知道C++ >代码>类型名< /COD>,用来告诉解析器一些符号是类型。为什么我们必须在typedef之后使用它,而不是用于继承
假设你有这个typedef中typename的用法与继承 只是想知道C++ >代码>类型名< /COD>,用来告诉解析器一些符号是类型。为什么我们必须在typedef之后使用它,而不是用于继承,c++,syntax,typename,C++,Syntax,Typename,假设你有这个 struct C { /* a class */ }; template<class T> struct S { typedef C type; // S<T>::type is a type }; 或者是否有我不知道的typedef的用法,这使得这一点模棱两可 PS:我很确定这已经被问过了,但是我找不到它(有很多噪音与typename关键字有关)。这个问题只是关于语法,而不是使用继承还是typedefs更好。如果有重复的,我会提前通知。原因是ty
struct C { /* a class */ };
template<class T> struct S {
typedef C type; // S<T>::type is a type
};
或者是否有我不知道的typedef
的用法,这使得这一点模棱两可
PS:我很确定这已经被问过了,但是我找不到它(有很多噪音与
typename
关键字有关)。这个问题只是关于语法,而不是使用继承还是typedefs更好。如果有重复的,我会提前通知。原因是typedef
语法比继承语法更可变。通常你会先写typedef
,然后再写类型名。但顺序其实并不重要。也就是说,以下是有效的typedef
:
int typedef integer_type;
现在考虑一下如果使用一个从属的名称:
会发生什么?S<T>::type typedef integer_type;
S::type typedef integer\u type;
如果不进行一些非常重要的前瞻性操作,解析器就无法知道
S::type
在这里引用了一个类型名(因为它还没有看到typedef
),因此根据消歧规则,它可以推断出一个值。为了语法的一致性,前缀typedef
没有特殊情况(您是对的,它是明确的)。可能有特殊情况,但根本没有。以前已经回答过了。看看这里:@PetrBudnik这个链接实际上并没有包含这个特定问题的答案。@KonradRudolph确实有,而且非常详细。阅读已接受答案的部分“typename”关键字以及其他注释和示例。@PetrBudnik:我刚刚阅读了这两部分,答案如你所说的详细,但我在那里找不到答案:\@Petr你错了。请阅读我的答案,并告诉我在另一个问题的公认答案中解释了这些信息。Johannes甚至没有提到typedef
(而且使用typedef
的一个代码段没有从属名称,因此不需要typename
)。感谢您的简短介绍!我不知道这个语法,这正是我要找的;)
int typedef integer_type;
S<T>::type typedef integer_type;