我正在尝试实施以下内容:
#include <array>
#include <cstdint>
class Class2
{
};
class Class1
{
public:
static constexpr uint8_t GetMax() { return 5; }
static constexpr uint8_t GetMin() { return 0; }
static constexpr uint8_t GetCount() { return GetMax() - GetMin() + 1; }
private:
std::array<Class2, Class1::GetCount()> m_classes;
};
但由于错误,我无法让它发挥作用:
非类型模板参数不是常量表达式
我正在使用Xcode 5.0。有什么想法吗?
答案 0 :(得分:2)
按照Nemanja Boric的回答,我将静态方法转换为静态成员。这不是我想要的修复,但它有效。我想剩下的问题是为什么不起作用?
#include <array>
#include <cstdint>
class Class2
{
};
class Class1
{
public:
static constexpr uint8_t Max = 5;
static constexpr uint8_t Min = 0;
static constexpr uint8_t Count = Max - Min + 1;
private:
std::array<Class2, Class1::Count> m_classes;
};
答案 1 :(得分:2)
我们这里遇到的问题在3.3.7 - 类范围中间接描述:
typedef int c;
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK: X::c
char c;
enum { i = 2 };
};
这一段应该多说一点(9.2.2):
在类说明符的结束时,类被认为是一个完全定义的对象类型(3.9)(或完整类型)。在类成员规范中,该类在函数体中被视为完整,默认参数,非静态数据成员的异常规范和大括号或大小写初始化程序(包括嵌套类中的这类内容)。 否则在其自己的类成员规范中被视为不完整。
由于std::array<Class2, Class1::GetCount()>
既不是函数体,默认的arguemnts,exception-specification,brace-or-equal 初始值设定项,此时,class被认为是不完整的,所以我认为它是由编译器决定何时允许,或者不允许 - 但是编译代码的标准是正常的。
只有我能想到的解决方案就是你建议的解决方案,或者将constexprs移动到另一个(可能的基础)类中。