以下讨论中显示了一种查找模板数组中元素数量的非常简单的方法:
我想模拟相同的方法来获取模板模板数组中的元素数量:
//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;
}
#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.
为什么我会收到此错误?
蒂亚
T
中的template <typename T> class A
并没有介绍T
。它未使用。你必须介绍一下typename T
。
应该是
template <template <typename> class A, typename T, size_t N>
size_t cal_size(const A<T>(&)[N]){
return N;
}