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;