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

如何向模板类传递模板化整数?C++模板模板参数问题

问题分析与解决

核心错误点

  1. 模板模板参数的误用:你定义的B使用了模板模板参数template<int W, int H> typename A,但B的构造函数中直接引用W和H是错误的——这两个参数是模板A的参数,而非B自身的模板参数,编译器无法在B的作用域中找到它们。
  2. 实例化方式错误:A<50,50>是一个已实例化的具体类型,而B的模板参数要求的是一个未实例化的模板(需要能接收两个int参数的模板),因此报错"A<50,50> is not a template class"。

两种可行的修正方案

方案1:让B携带自身的数值模板参数

调整B的模板参数,同时接收模板模板参数A和数值参数W、H,再在B内部用这些参数实例化A:

#include <iostream>

template<int W, int H>
struct A
{
    A()
    {
        std::cout << W << " - " << H << std::endl;
    }
};

// 修正后的B:新增W、H作为自身模板参数
template<template<int W, int H> typename A, int W, int H>
struct B
{
    B()
    {
        A<W, H> a; // 用B的参数实例化A,触发A的构造输出
    }
};

int main()
{
    B<A, 50, 50> b; // 正确实例化:传入模板A,以及数值50、50
    return 0;
}

方案2:让B接收具体类型,通过A的静态成员获取数值

如果希望B直接接收已实例化的A<W,H>类型,可以修改B为普通模板参数,并给A添加静态成员存储W和H:

#include <iostream>

template<int W, int H>
struct A
{
    static constexpr int W_val = W; // 新增静态成员存储宽高
    static constexpr int H_val = H;
    A()
    {
        std::cout << W << " - " << H << std::endl;
    }
};

// B改为接收具体类型T
template<typename T>
struct B
{
    B()
    {
        // 通过T的静态成员访问数值
        std::cout << T::W_val << " - " << T::H_val << std::endl;
        // 也可以直接创建T的实例
        T a;
    }
};

int main()
{
    B<A<50, 50>> b; // 正确实例化:传入已实例化的A<50,50>类型
    return 0;
}

总结

  • 原B的模板模板参数语法本身没问题,但构造函数引用未声明的W、H是错误的。
  • 实例化B时,若用模板模板参数,需传入未实例化的模板(如A),并补充B自身的数值参数;若想传入已实例化的类型(如A<50,50>),则需将B改为接收普通类型参数。

内容的提问来源于stack exchange,提问作者Iván Ayala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:53:30