只是想知道C ++ typename
,用于告诉解析器某些符号是类型。为什么我们必须在typedef
之后使用它而不是继承?
示例:想象你有这个
struct C { /* a class */ };
template<class T> struct S {
typedef C type; // S<T>::type is a type
};
困扰我的是:
template<class T> struct Typedef {
typedef typename S<T>::type MyType; // needs typename
};
template<class T> struct Inheritance
: S<T>::type // doesn't need typename
{ };
在这两种情况下,解析器都应该期望一个类型,因此它可以将S<T>::type
解析为一个类型。为什么它只对继承而不是对typedef这样做?这种模式对我来说似乎是一样的:
typedef $type$ $new_symbol$;
class $new_symbol$ : $type$ { $definition$ };
或者是否有typedef
的用法我不知道,这会使这个含糊不清?
PS:我很确定已经提出过这个问题,但我找不到它(有很多与typename
关键字相关的噪音)。这个问题只是关于语法,而不是使用继承或typedef是否更好。如果有重复,我会事先道歉。
答案 0 :(得分:3)
原因是typedef
语法比继承语法更可变。 通常您可以先写typedef
,然后输入类型名称 second 。但订单实际上并不重要。也就是说,以下是有效的typedef
:
int typedef integer_type;
现在考虑如果我们使用从属名称会发生什么:
S<T>::type typedef integer_type;
在没有做一些非平凡的预测的情况下,解析器无法知道S<T>::type
在这里引用了类型名称(因为它还没有看到typedef
),所以通过消歧规则它可以推断一个值。为了保持语法的一致性,对于前缀typedef
没有特殊情况(你是对的,是明确的)。可能有一个特例,但根本就没有。