我想要模板化函数中的静态数组,该数组的长度取决于函数专用的类型。我的第一次尝试是:
标头:
template<typename T>
struct Length {
const static size_t len;
};
template<typename T>
void func(){
static T vars[Length<T>::len]; // len not const. according to compiler!
// ...
}
源文件:
template<> const size_t Length<double>::len = 2;
template<> const size_t Length<float>::len = 1;
// ...
但是,g++
不编译并抱怨
错误:“ vars”的存储大小不恒定
那么,这到底是什么问题呢?我知道固定长度数组的大小必须是一个常数,并且在编译时就知道,但是这里似乎是这样。当我写
const size_t len = 2;
void func(){
static double vars[len];
}
它编译没有问题。
题:
代码有什么问题,并且有哪些替代方法可以实现所需的行为?我不想在运行时分配内存...
为了使const
变量被视为编译时常量(形式上是常量表达式),其值必须在使用时可用。这意味着专门的定义将必须转到头文件。
如果像您所做的那样只是成员的专业化,那么我相信这会给您带来多定义错误。专门化整个类模板并保持内联静态成员定义应该没问题:
template<typename T>
struct Length;
template <>
struct Length<double>
{
static const size_t len = 2;
};
附带说明一下,您的程序原本是无效的:必须在使用前声明一个显式的特殊化。这意味着你必须至少申报的专业化len
的头部(或无处不在,你打算使用它)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句