当我使用constexpr初始值设定项和枚举模板论证时,我注意到我的代码中有些奇怪的东西。例如,以下代码将编译:
enum class TestEnum1 {
Val1,
Val2
};
template <TestEnum1 EnumVal> class TestClass1 {
public:
constexpr TestClass1() {
}
};
class TestClass2 {
public:
TestClass1<TestEnum1::Val1> TestObject = TestClass1<TestEnum1::Val1>();
};
int main() {
TestClass2 testObj;
}
而以下不会:
enum class TestEnum1 {
Val1,
Val2
};
template <typename T, TestEnum1 EnumVal> class TestClass1 {
public:
constexpr TestClass1() {
}
};
class TestClass2 {
public:
TestClass1<int, TestEnum1::Val1> TestObject = TestClass1<int, TestEnum1::Val1>();
};
int main() {
TestClass2 testObj;
}
请注意,我只在现有模板之前添加了另一个模板参数。错误消息类似于:
error: 'enum class TestEnum1' is not a class or a namespace
error: expected ';' at end of member declaration
error: expected unqualified-id before '>' token
error: expected unqualified-id before ')' token
error: template argument 1 is invalid
如果有人能解释原因或至少解决问题,我很高兴。我使用g ++ 5.3和--std = c ++ 11和windows 10。
编辑:我刚刚测试enum
,在哪些情况下仍然出现错误,但删除了错误列表中的第一项。经过测试int
,一切都很顺利。