2009-10-05 40 views
0

所以我刚刚通过编译器错误了解到,数组的类内初始化是无效的(为什么?)。现在我想在模板类中初始化一些数组,不幸的是内容依赖于模板参数。浓缩的测试用例如下所示:非整数静态数据的类初始化

template<typename T> 
struct A { 
    T x; 
    static const int len = sizeof(T);   // this is of course fine 
    static const int table[4] = { 0, len, 2*len, 3*len }; //this not 
} 

任何想法如何拉出恒定数组?

编辑:添加了'int's。

+1

这不是有效的C++代码。你不能省略int(即使你的编译器显然将它视为默认值)。提示:调出错误/警告级别。 – 2009-10-05 08:09:23

+0

该代码不被复制/粘贴,我只是键入它(看起来很快)在原来的我没有省略整数,谢谢 – hirschhornsalz 2009-10-05 10:20:53

回答

5

就像你没有模板一样;把初始化类的声明外:

template<class T> 
const int A<T>::table[4] = { 0, len, 2*len, 3*len }; 
+0

现在我#米想知道为什么我只是没有这样试试。我猜,早上太早了。 – hirschhornsalz 2009-10-05 10:22:51

+0

我想大家都有这个时刻:) – 2009-10-05 11:13:38

0

template <typename T, int index> 
struct Table { 
    static const len = sizeof(T);   
    static const value = len*index; 
}; 
+0

索引不是一个常数值,所以不幸这个不行。此外,实际上该表包含128位大小的常量,这些常量不能通过乘法有效地计算。这就是我首先使用表格的原因 – hirschhornsalz 2009-10-05 10:40:27

2
class Y 
    { 
    const int c3 = 7; // error: not static 
    static int c4 = 7; // error: not const static const 
    float c5 = 7; // error not integral 
    }; 

那么,为什么这些不方便的限制存在?一个类通常在头文件中声明,而头文件通常包含在许多翻译单元中。但是,为了避免复杂的链接器规则,C++要求每个对象都有唯一的定义。如果C++允许需要作为对象存储在内存中的实体类的定义,那么该规则将被打破。

更多详细阅读:How do I define an in-class constant?

+0

澄清:int值的情况也是如此。即使'static int const'可能不会被定义在类内部。事实上看起来像一个定义不是一个。这可以通过试图获取该静态成员的地址来轻松进行测试:这会失败,因为该成员从不定义,只能声明。 – 2009-10-05 08:14:30

+0

谢谢,现在我看到了区别。实际上,“static const int”在早期版本中是“#define LEN(sizeof(T))”。 – hirschhornsalz 2009-10-05 10:28:52