模板类中的c ++枚举不能用作const值

时间:2015-03-19 10:58:44

标签: c++ templates const

这是代码,

#include<iostream>
using namespace std;

template <typename T>
class TestClass {
  T value;
  enum _SyncType {
    SYNC_TYPE,
    ASYNC_TYPE,
  };

  static const char *const kSyncString[];
};

template <typename T>
const char *const TestClass<T>::kSyncString[] = {
  [TestClass<T>::SYNC_TYPE]  = "sync type",
  [TestClass<T>::ASYNC_TYPE]  = "async type",
};

int main() {
  TestClass<int> test;
  return 0;
}

当我编译它时,它会提醒

prog.cpp:19:1: error: the value of 'SYNC_TYPE' is not usable in a constant expression
 };
 ^
prog.cpp:8:5: note: 'TestClass<T>::_SyncType SYNC_TYPE' is not const
     SYNC_TYPE,
     ^
prog.cpp:19: confused by earlier errors, bailing out

我想也许模板还没有任何实例,但是我该如何编写这样的代码呢?

1 个答案:

答案 0 :(得分:2)

const char *const TestClass<T>::kSyncString[] = {
  [TestClass<T>::SYNC_TYPE]  = "sync type",
  [TestClass<T>::ASYNC_TYPE]  = "async type",
};

这种初始化方式称为designated initializer,C99具有。自C++11 doesn't have this feature以来,gcc将此功能作为扩展名。

我在it中找到the onlinedocs。它是对C语言家族的扩展&#34;而不是&#34; 7扩展到C ++语言&#34;。所以,我猜gcc不能在C扩展中处理C ++特性(TestClass<T>::SYNC_TYPE - 模板和范围 - 运算符)。 (只是猜测&gt; o&lt;)无论如何,似乎确定它是编译器扩展失败的。

相关问题