如何向模板类传递模板化整数?C++模板模板参数问题
问题分析与解决
核心错误点
- 模板模板参数的误用:你定义的
B使用了模板模板参数template<int W, int H> typename A,但B的构造函数中直接引用W和H是错误的——这两个参数是模板A的参数,而非B自身的模板参数,编译器无法在B的作用域中找到它们。 - 实例化方式错误:
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
相关产品推荐
相关产品推荐

