typedef与继承中typename的用法
Usage of typename in typedef versus inheritance
只是想知道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
没有特殊情况(您是对的,是明确的)。
相关文章:
- 这个指针在c++中的用法
- 为什么返回类型中需要typename?C++
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 构造函数的用法
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 奇怪的typename用法c++11
- typedef与继承中typename的用法