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

使用模板模板参数推导数组大小遇编译错误,求原因

编译错误原因分析:模板参数作用域问题

我尝试效仿数组元素数量推导的方法,获取模板类数组的元素数量,编写了如下代码:

//classA.h

#include <type_traits>
#include <cstddef>
#include <iostream>

using std::is_same;
using std::size_t;
using std::cout;
using std::endl;

template<typename T> class A;
template<typename T>
using array2As = A<T>[2];

template<template<typename T>class A, size_t N>
size_t cal_size(A<T>*&[N]){
 return N;
}

template<typename T>
class A{
  public:
  A(T);
  private:
  A()=delete;
  A(const A&)=delete; 
  A& operator=(const A&)=delete;
  T elem;
};

template<typename T>
A<T>::A(T elem){
  static_assert(is_same<T,int>::value || is_same<T,double>::value, "Compilation error: type must be int or double");
  this->elem = elem;
}


// main.cpp
#include "classA.h"

int main (){
 
 array2As<int> a = {A(5),A(7)};
 auto sz = cal_size(a); 
 array2As<double> b = {A(1.2),A(6.3)};
 auto sz = cal_size(b); 

 return 0;
}

编译时出现如下错误:

In file included from main.cpp:1:
classA.h:18:19: error: ‘T’ was not declared in this scope
   18 | size_t cal_size(A<T>*&[N]){
      |                   ^
compilation terminated due to -Wfatal-errors.

错误原因

核心问题是模板参数的作用域不匹配:

  • 函数模板声明里的template<typename T>class A是模板模板参数,这里的T是模板A的内部参数,仅属于A的定义范围,不能直接在函数参数列表A<T>*&[N]中使用——当前作用域并未将T声明为独立模板参数,编译器找不到它的定义。
  • 另外,函数参数A<T>*&[N]是指针的引用数组类型,和你定义的array2As<int>(即A<int>[2])完全不匹配,即便解决了T的问题,也会出现类型不匹配错误。

修正方案

  1. 将T作为独立模板参数加入函数模板,调整模板参数顺序;
  2. 将函数参数改为数组的引用类型,才能匹配实际的数组对象:

修正后的cal_size函数模板:

template<typename T, template<typename>class A, size_t N>
size_t cal_size(A<T> (&arr)[N]){
 return N;
}

另外需注意,主函数里不能重复定义auto sz,需改成不同变量名(比如sz1和sz2),避免重定义错误。

内容的提问来源于Stack Exchange,提问作者Vinod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:13:21