在typedef与继承中使用typename

时间:2014-03-13 09:34:09

标签: c++ syntax typename

只是想知道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是否更好。如果有重复,我会事先道歉。

1 个答案:

答案 0 :(得分:3)

原因是typedef语法比继承语法更可变。 通常您可以先写typedef ,然后输入类型名称​​ second 。但订单实际上并不重要。也就是说,以下是有效的typedef

int typedef integer_type;

现在考虑如果我们使用从属名称会发生​​什么:

S<T>::type typedef integer_type;

在没有做一些非平凡的预测的情况下,解析器无法知道S<T>::type在这里引用了类型名称(因为它还没有看到typedef),所以通过消歧规则它可以推断一个值。为了保持语法的一致性,对于前缀typedef没有特殊情况(你是对的,明确的)。可能有一个特例,但根本就没有。