C++ 非整数静态数据的类内初始化

C++ 非整数静态数据的类内初始化,c++,static,C++,Static,所以我刚刚通过一个编译器错误了解到数组的类内初始化是无效的(为什么?)。现在我想在模板类中初始化一些数组,不幸的是,内容取决于模板参数。压缩测试用例如下所示: 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*

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

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
}
模板
结构A{
tx;
static const int len=sizeof(T);//这当然很好
static const int table[4]={0,len,2*len,3*len};//这不是
}
知道如何提取常量数组吗


编辑:添加“int.”

就像不使用模板一样;将初始化置于类的声明之外:

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

样板
结构表{
静态常数len=sizeof(T);
静态常量值=长度*索引;
};
那么,为什么会存在这些不方便的限制呢?类通常在头文件中声明,头文件通常包含在许多翻译单元中。但是,为了避免复杂的链接规则,C++要求每个对象都有唯一的定义。如果C++中的类定义需要存储在内存中,则该规则将被破坏。
<> >详细阅读:<强> <强> < /p>这不是有效的C++代码。您不能省略
int
(即使编译器显然将其视为默认值)。提示:调高错误/警告级别。代码没有被复制/粘贴,我只是在原件中键入了它(看起来很快),我没有省略int,感谢澄清:
int
值也是如此。即使是
static int const
也不能在类内内联定义。看起来像定义的东西实际上不是定义。通过尝试获取静态成员的地址可以很容易地测试这一点:这将失败,因为该成员从未定义过,只是声明过。谢谢,现在我看到了区别。事实上,“static const int”在早期版本中是“#define LEN(sizeof(T))”,现在我想知道为什么我没有这样尝试。我猜是早上太早了。我猜每个人都有这样的时刻:)索引不是一个常量,所以不幸的是这不起作用。此外,实际上该表包含128位大小的常数,无法使用乘法有效地计算这些常数。这就是我最初使用桌子的原因

template <typename T, int index>
struct Table {
   static const len = sizeof(T);        
   static const value = len*index;
};
 class Y
  { 
     const int c3 = 7; // error: not static 
     static int c4 = 7; // error: not const static const
     float c5 = 7; // error not integral
  };