使用模板化基类型对派生结构进行struct初始化

时间:2015-08-03 18:11:29

标签: c++ c++11

我试图在派生自模板结构上使用struct initialization。代码如下:

template <class Derived>
struct Event{
//the level of access on the ctor has nothing to do with the problem
//protected:
//    Event() = default;
};

struct MoveEvent: Event<MoveEvent>{
    int x, y;
};


int main(){
    //how do I make this work?
  //MoveEvent event = {.x =5, .y = 4};
}

我认为它可能与CTRP有关,但将Event<MoveEvent>更改为Event<int>会产生同样的问题。此外,我认为这是POD的一个问题,但std::is_pod会为true返回MoveEvent。那么这里的问题是什么?为什么我不能使用struct initialization?

2 个答案:

答案 0 :(得分:5)

您只能对聚合进行聚合初始化。汇总来自[dcl.init.aggr]:

  

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有私有或者   受保护的非静态数据成员(第11条),无基类(第10条),没有虚函数(10.3)。

/** Constraint domain to memebers of a list (of numbers only) **/ domain_list_constraint(_, []) :- !. domain_list_constraint(DomainVar, List) :- member(E, List), (atom(E)->atom_number(E, I), DomainVar #= I; DomainVar #= E). 不是聚合。因此,您必须添加构造函数:

MoveEvent

答案 1 :(得分:2)

由于某些原因,您无法使用此语法,首先“指定的初始值设定项”是C要素,not a C++ feature

UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
int userCount = userManager.getUserCount();

其次,您不能对派生类使用聚合初始化,因为只要引入继承,就no longer have a POD aggregate type

最好的方法是为派生类

定义构造函数
MoveEvent event = {.x = 5, .y = 4};

然后你可以这样做

struct MoveEvent: Event<MoveEvent>
{
    MoveEvent(int _x, int _y) : x{_x}, y{_y} {}
    int x, y;
};