pir*_*iri 6 c++ arrays templates template-specialization
我想在模板化函数中使用静态数组,其长度取决于函数专用的类型.我的第一次尝试是:
标题:
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!
// ...
}
Run Code Online (Sandbox Code Playgroud)
源文件:
template<> const size_t Length<double>::len = 2;
template<> const size_t Length<float>::len = 1;
// ...
Run Code Online (Sandbox Code Playgroud)
但是,g++不编译这个并抱怨
错误:'vars'的存储大小不是常数
那么问题到底是什么?我知道固定长度数组的大小需要是一个常量并且在编译时已知,但这似乎就是这种情况.当我写作
const size_t len = 2;
void func(){
static double vars[len];
}
Run Code Online (Sandbox Code Playgroud)
它编译没有问题.
题:
代码有什么问题,有哪些替代方案可以实现所需的行为?我不想在运行时分配内存...
要使const变量被视为编译时常量(正式地,常量表达式),其值必须在使用时可用.这意味着专用定义必须转到头文件.
如果只是作为成员的特化完成,就像你一样,我认为这会给你一个多重定义错误.你应该没关系整个类模板,并保持静态成员定义内联:
template<typename T>
struct Length;
template <>
struct Length<double>
{
static const size_t len = 2;
};
Run Code Online (Sandbox Code Playgroud)
作为旁注,您的程序最初是无效的:必须在使用前声明显式特化.这意味着你必须至少申报的专业化len的头部(或无处不在,你打算使用它).
| 归档时间: |
|
| 查看次数: |
623 次 |
| 最近记录: |