typedef与继承中typename的用法

Usage of typename in typedef versus inheritance

本文关键字:用法 typename 继承 typedef      更新时间:2023-10-16

只是想知道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没有特殊情况(您是对的,明确的)。