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

如何从模板父类导入模板成员类型且无需重复名称?

问题解答

在C++20之前的标准中,无法像导入非模板类型别名那样,不重复名称就从模板基类导入模板别名。你必须显式重复别名名称,就像你代码里可行的那行写法。

原因

C++语法规则里,针对模板别名的using声明,没有提供类似非模板类型的using typename Base::Type;这种简洁语法。模板别名的导入必须完整写出template<参数列表> using 别名 = 基类的模板别名<参数>;的形式,其中别名名称必须重复指定。

C++20的简化方案

C++20新增了模板using声明的简化语法,可以直接导入基类的模板别名而无需重复名称,写法如下:

template<typename T> using Target::Matrix;

修改后的完整可运行代码(需开启C++20编译选项):

#include <vector>

struct CPU
{
    using SimpleType = int;
    template<typename T> using Matrix = std::vector<std::vector<T>>;
};

template<typename Target>
struct Pipeline : public Target
{
    using typename Target::SimpleType; 

    // C++20 支持的简洁写法,无需重复Matrix名称
    template<typename T> using Target::Matrix;

    void ff()
    {
        SimpleType x;
        Matrix<float> y;
    }
};

int main()
{
    Pipeline<CPU> pipeline;
    pipeline.ff();
}

旧标准兼容方案

如果你的项目仍在使用C++17或更早的标准,就只能采用你代码中那种重复名称的写法,没有更简洁的替代方案:

template<typename T>
using Matrix = typename Target::template Matrix<T>;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:35:35