模板函数中与类型有关的常量

Piripiri

我想要模板化函数中的静态数组,该数组的长度取决于函数专用的类型。我的第一次尝试是:

标头:

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];
}

它编译没有问题。

题:

代码有什么问题,并且有哪些替代方法可以实现所需的行为?我不想在运行时分配内存...

Angew不再为SO感到骄傲

为了使const变量被视为编译时常量(形式上是常量表达式),其值必须在使用时可用。这意味着专门的定义将必须转到头文件。

如果像您所做的那样只是成员的专业化,那么我相信这会给您带来多定义错误。专门化整个类模板并保持内联静态成员定义应该没问题:

template<typename T>
struct Length;

template <>
struct Length<double>
{
  static const size_t len = 2;
};

附带说明一下,您的程序原本是无效的:必须在使用前声明一个显式的特殊化。这意味着你必须至少申报的专业化len的头部(或无处不在,你打算使用它)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有关React中的函数类型的说明

与将非常量左值绑定到构造函数中的右值有关的错误

有关模板中通用初始化的C ++

将不同的模板化类存储在一个容器中,而不会丢失有关其类型的信息

与Java方法调用中的类型参数有关的问题

在Haskell中模拟与路径有关的类型

与Mysql中的bigint数据类型有关

有关C ++中char数据类型的问题

有关TypeScript中的条件类型的问题

有关TypeScript中通用构造函数引用的问题

有关函数的代码中的问题(Python)

获取有关Lua中调用函数的参考

有关Python中的Lambda函数的问题

与connectedCallback有关的模板标记的时间

ASM如何通知我有关强制类型转换和构造函数调用的类型注释

constexpr静态模板函数:g ++错误是有关clang的警告

有关具有不同返回类型的函数重载的问题

与类型转换有关的JLS

有关类型不匹配的错误

模板中具有关联类型的特征

在模板函数中删除常量

有关构造函数的问题

与泛型有关的类型错误,取决于函数的位置

Haskell函数类型声明中有关括号的详细信息

Django Ajax 请求与我的模板中返回的数据有关

从函数中,如何获取有关实际调用此函数的模块的详细信息?

标准中有关“基本构造函数中的虚拟函数调用”的部分在哪里?

尝试使用NUnit测试构造函数时,获取有关构造函数中参数的错误

变量范围有关。从不同的函数调用函数中的变量-意外的行为/结果