使用模板模板参数推导数组大小遇编译错误,求原因
编译错误原因分析:模板参数作用域问题
我尝试效仿数组元素数量推导的方法,获取模板类数组的元素数量,编写了如下代码:
//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的问题,也会出现类型不匹配错误。
修正方案
- 将
T作为独立模板参数加入函数模板,调整模板参数顺序; - 将函数参数改为数组的引用类型,才能匹配实际的数组对象:
修正后的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
相关产品推荐
相关产品推荐

