You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从派生模板类访问基类中定义的模板类型?

问题:在模板派生类中访问基类的模板内部类型

我想要从派生模板类SubClass中访问基类的模板内部类型InsideType,但在Visual Studio 2022 C++20环境下编译出错,代码如下:

// 这里可以有更多类型的基类,它们都定义了`InsideType`。
struct BaseClass
{
    template <class T>
    struct InsideType
    {
    };
};

// 子类可以继承一种基类。 
template <class Base>
struct SubClass : public Base
{
    // Visual Studio 2022 C++20下编译错误:
    //   error C2059: 语法错误: '<'
    //   error C2238: 在';'之前有意外的标记
    typename Base::InsideType<int> val;
};

int main()
{
    SubClass<BaseClass> var;
    return 0;
}

编译错误信息:

// error C2059: syntax error: '<'
// error C2238: unexpected token(s) preceding ';'
typename Base::InsideType<int> val;

解决方案

需要在Base::InsideType前添加template关键字,明确告诉编译器InsideType是一个模板,修正后的代码如下:

// 这里可以有更多类型的基类,它们都定义了`InsideType`。
struct BaseClass
{
    template <class T>
    struct InsideType
    {
    };
};

// 子类可以继承一种基类。 
template <class Base>
struct SubClass : public Base
{
    // 添加template关键字,指明InsideType是模板
    typename Base::template InsideType<int> val;
};

int main()
{
    SubClass<BaseClass> var;
    return 0;
}

原因解释

因为Base是模板参数,属于依赖名称,编译器在处理模板定义时无法确定Base::InsideType到底是普通类型还是模板类型。此时需要用template关键字限定,让编译器识别后面的<是模板参数列表的开始而非比较运算符,再结合typename关键字表明InsideType<int>是一个类型,即可正常编译。

内容的提问来源于stack exchange,提问作者czs108

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:47:21