在写我最初的问题时,如果这是可能的话,我偶然发现了问题static constexpr member of same type as class being defined,它非常清楚地回答了我的干净解决方案无法用C ++ 11实现。
但后来我提出了这个与原始海报非常接近的代码,我想实现:
class MyEnum
{
public:
constexpr MyEnum() : m_null(true), m_value(0) { }
constexpr MyEnum(const unsigned int v) : m_null(false), m_value(v) { }
constexpr operator unsigned int() const { return m_value; }
static constexpr const MyEnum one() { return MyEnum(1); }
private:
bool m_null;
unsigned int m_value;
};
所以我改述了我的问题:为什么one
的解决方案可以编译并且可以像你期望的那样使用,但是下面的解决方案会给出使用不完整类的错误?
class MyEnum
{
public:
// snip...
static constexpr const MyEnum two = MyEnum(2);
static constexpr const MyEnum three = 3;
// snip...
}
答案 0 :(得分:9)
由于@dyp提到了one
编译的解决方案,因为函数定义是在类主体之后编译的。所以它就像one
一样被声明为
class MyEnum
{
public:
static constexpr const MyEnum one();
//... Definition here
}; //Class is fully defined after here
inline static constexpr const MyEnum MyEnum::one() { return MyEnum(1); }
//Fine here because class is complete ^^^^
另一方面,类体中的定义在它们放置在类体中时被编译。因此,当编译two
和three
时,类尚未完全定义。