只是想知道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 $type$ $new_symbol$;
class $new_symbol$ : $type$ { $definition$ };
还是我不知道typedef
的用法,这使得它模棱两可?
PS:我很确定这个问题已经被问过了,但是我找不到它(有很多与typename
关键字相关的噪音)。这个问题只与语法有关,与使用继承或类型定义哪个更好无关。如果有重复的,我先道歉。
原因是typedef
语法比继承语法更可变。通常首先写typedef
,然后写类型名。但顺序其实并不重要。也就是说,以下是一个有效的typedef
:
int typedef integer_type;
现在考虑如果使用依赖名称会发生什么:
S<T>::type typedef integer_type;
如果不做一些重要的提前查找,解析器就无法知道S<T>::type
在这里引用了一个类型名(因为它还没有看到typedef
),所以它根据消歧规则推断出一个值。为了语法的一致性,对于前缀typedef
没有特殊情况(您是对的,是明确的)。