2016-03-03 71 views
40

此代码给我不完整类型错误。 问题是什么?一个班级不允许自己拥有静态成员实例? 有没有办法达到同样的效果?一个类不能有自己的静态constexpr成员实例吗?

struct Size 
{ 
    const unsigned int width; 
    const unsigned int height; 

    static constexpr Size big = { 480, 240 }; 

    static constexpr Size small = { 210, 170 }; 

private: 

    Size() = default; 
}; 
+4

您是否在具体询问'constexpr'静态成员? –

+0

@PiotrSkotnicki是的。删除关键字does'n使它无论如何工作。 – nyarlathotep108

+1

一旦你删除关键字,你可以初始化它,而我已经是一个完整的类型 –

回答

38

有没有办法达到同样的效果?

通过 “相同的结果”,你特别想要的constexpr -ness的 Size::bigSize::small?在这种情况下,这可能会足够接近:

struct Size 
{ 
    const unsigned int width = 0; 
    const unsigned int height = 0; 

    static constexpr Size big() { 
     return Size { 480, 240 }; 
    } 

    static constexpr Size small() { 
     return Size { 210, 170 }; 
    } 

private: 

    constexpr Size() = default; 
    constexpr Size(int w, int h) 
    : width(w),height(h){} 
}; 

static_assert(Size::big().width == 480,""); 
static_assert(Size::small().height == 170,""); 
58

允许具有相同类型的静态成员。然而,一个类在定义结束之前是不完整的,并且一个对象不能用定义为而且类型不完整。你可以用声明一个不完整类型的对象,并在稍后完成的地方定义它(在类之外)。

struct Size 
{ 
    const unsigned int width; 
    const unsigned int height; 

    static const Size big; 
    static const Size small; 

private: 

    Size() = default; 
}; 

const Size Size::big = { 480, 240 }; 
const Size Size::small = { 210, 170 }; 

看到这里:http://coliru.stacked-crooked.com/a/f43395e5d08a3952

这并不适用于constexpr成员的工作,但是。

+1

你认为这对'constexpr'成员不适用,因为标准禁止或因为编译器错误? – nyarlathotep108

+6

@ nyarlathotep108它不起作用,因为'static constexpr'成员需要内联初始化。 – Brian

相关问题