这是代码,
#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
我想也许模板还没有任何实例,但是我该如何编写这样的代码呢?
答案 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;)无论如何,似乎确定它是编译器扩展失败的。