C++ 带有std::array的constexpr-“;非类型模板参数不是常量表达式;
我正在尝试实现以下内容:C++ 带有std::array的constexpr-“;非类型模板参数不是常量表达式;,c++,templates,c++11,clang,constexpr,C++,Templates,C++11,Clang,Constexpr,我正在尝试实现以下内容: #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() {
#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;
};
#包括
#包括
二级
{
};
一班
{
公众:
静态constexpr uint8_t GetMax(){return 5;}
静态constexpr uint8_t GetMin(){return 0;}
静态constexpr uint8_t GetCount(){return GetMax()-GetMin()+1;}
私人:
std::数组m_类;
};
但由于错误,我无法使其工作:
非类型模板参数不是常量表达式
我使用的是Xcode 5.0。有什么想法吗?根据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;
};
#包括
#包括
二级
{
};
一班
{
公众:
静态constexpr uint8_t Max=5;
静态constexpr uint8_t Min=0;
静态constexpr uint8_t Count=最大-最小+1;
私人:
std::数组m_类;
};
我们在这里遇到的问题在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
不是函数体、默认参数、异常规范、大括号或相等的初始值设定项,在这一点上,类被认为是不完整的,所以我认为由编译器决定什么时候允许这样做,或者不允许这样做-但根据标准,不编译代码是可以的
我能想到的唯一解决方案是您建议的解决方案,或者将constexpr移动到另一个(可能的基类)类中。看起来您遇到了一个稍微不同的错误:“
GetCount()
在其定义之前使用”。这大概是因为Class1
的成员声明不完整。但这不是答案,因为(a)我不确定,和(b)我不知道如何修复它。@MikeSeymour我认为你是对的,因为在Class1
之外声明数组是有效的。但我想看看如何修复它。@MikeSeymour“成员声明不完整”是什么意思?据我所知,它是完整的。顺便说一句,这些方法不应该是内联的吗?这里的注释()应该是相关的:“嗯……我想我们刚才讨论过这一点:内联函数定义被视为是在类定义之后定义的;因此在类定义中它们还不可用。请注意,您总是可以说static const int number=256;或者static constepr int number=256;而不是。“谢谢你的推荐,这就把事情弄清楚了。