gpt4 book ai didi

c++ - typedef 中 typename 的使用与继承

转载 作者:搜寻专家 更新时间:2023-10-31 01:45:17 25 4
gpt4 key购买 nike

只是想了解 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 哪个更好。如果有重复,我提前道歉。

最佳答案

原因是 typedef语法比继承语法更多变。 通常你会写typedef 第一个,以及类型名称​​第二个。但顺序实际上并不重要。也就是说,以下是有效的 typedef :

int typedef integer_type;

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

S<T>::type typedef integer_type;

如果不做一些重要的前瞻,解析器就无法知道 S<T>::type在这里引用一个类型名称(因为它还没有看到 typedef ),所以根据消歧规则它推断出一个值。为了语法的一致性,前缀 typedef 没有特殊情况(您是对的, 是明确的)。可能有特殊情况,但根本没有。

关于c++ - typedef 中 typename 的使用与继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22374329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com