为什么嵌套类型的基类不需要`typename`?

Per*_*-lk 25 c++ inheritance templates

令我惊讶的是,typename当依赖类型作为基类出现时,没有必要添加:

struct B {};

struct wr
{ typedef B type; };

template<class T>
struct A : T::type
{};

int main()
{
    A<wr> a;
    (void)a;
}
Run Code Online (Sandbox Code Playgroud)

为什么typename不需要在前面T::type

lub*_*bgr 19

为什么typename不需要在前面T::type

因为您不能从值继承。您typename通常告诉编译器给定的嵌套标识符是一种类型,但是对于继承,无论如何都必须如此,因此可以忽略它-这就是语言typename为基本说明符提供-规则例外的原因。来自cppreference(重点是我的):

typename依存名称的歧义消除器

在模板(包括别名模板)的声明或定义中,除非使用关键字typename或已经使用关键字typename,否则不将其视为当前实例的成员并且依赖于模板参数的名称不视为类型。建立为类型名称,例如使用typedef声明或通过用来命名基类

请注意,我们将获得更多typename可省略的地方,请参阅P0634


Sto*_*ica 13

正如其他人所指出的,这是一个特例。在此引用标准:

[temp.res]

5隐式假定在class-or-decltype或elaborated-type-specifier中用作名称的限定名称来命名类型,而无需使用typename关键字。在立即包含依赖于模板参数的嵌套名称说明符的嵌套名称说明符中,隐式假定标识符或simple-template-id命名类型,而无需使用typename关键字。[?注意:这些结构的语法不允许使用typename关键字。?—尾注?]

随着C ++ 20的到来,对的需求将会有更多的例外typename


Bat*_*eba 5

typename在需要告诉编译器期望类型而不是其他类型时,才需要使用。

由于只能继承一个类型,因此不会产生歧义,因此typename也是多余的。