1

这是如何编译和工作的:

class MyObject {
public:
  MyObject() {}
};

struct ItemGood {
  int Number;
  MyObject *Object;

  ItemGood(int Number, MyObject *Object) {
    this->Number = Number;
    this->Object = Object;
  }
};

const ItemGood ItemGoodList[] =
{
  { 0, new MyObject() },
  { 1, new MyObject() }
};

这根本不编译:

class MyObject {
public:
  MyObject() {}
};

struct ItemBad {
  int Number;
  std::auto_ptr<MyObject> AutoObject;

  ItemBad(int Number, MyObject *Object) {
    this->Number = Number;
    AutoObject = std::auto_ptr<MyObject>(Object);
  }
};

const ItemBad ItemBadList[] =
{
  { 0, new MyObject() },
  { 1, new MyObject() }
};

编译器吐出的错误是:

没有匹配函数调用 'ItemBad::ItemBad(ItemBad)

我不明白为什么有些东西试图调用该构造函数,我不明白这个初始化列表中实际发生了什么。

4

4 回答 4

1

试试这个:

ItemBad(int Number, MyObject *Object) : Number(Number), AutoObject(Object) 
{}

似乎std::auto_ptr您的平台上没有复制构造函数,因此必须在构造函数的主体之前对其进行初始化。

于 2012-09-27T15:30:23.007 回答
1

因为std::auto_ptr没有正确的复制构造函数,这意味着您的类没有正确的复制构造函数,这意味着它不能从临时构造 - 这是您正在尝试做的。

只是垃圾auto_ptr并移动到unique_ptr

于 2012-09-27T15:33:06.510 回答
0

此外,您应该避免使用这样的初始化列表:

{ 0, new MyObject() }

相反,使用构造函数:

ItemBad(0, new MyObject())

例如,MSVC 编译器会为您的“好”变体和“坏”变体生成错误:只要您的类有一个 ctor,您就必须使用它,而不是初始化列表。

于 2012-09-27T15:39:02.210 回答
0

每个{ 0, new MyObject() }表达式都被一个构造函数调用替换ItemGood(int Number, MyObject *Object),所以编译器做了这样的事情:

const ItemGood ItemGoodList[] =
{
  ItemGood(0, new MyObject()), // temporal 'ItemGood' 1 (const &)
  ItemGood(1, new MyObject())  // temporal 'ItemGood' 2 (const &)
};

然后调用编译器生成的复制协构函数 forItemGood来填充每个的数组槽ItemGood,这里没有问题

ItemBad声明包含成员变量std::auto_ptr<MyObject> AutoObject,并且如另一个答案中所指出的那样,std::auto_ptr没有复制构造函数,因此编译器无法ItemBad. 当应用前面的逻辑时,我们得到与 with 相同的表达式替换ItemGood

const ItemBad ItemGoodList[] =
{
  ItemBad(0, new MyObject()), // temporal 'ItemBad' 1 (const &)
  ItemBad(1, new MyObject())  // temporal 'ItemBad' 2 (const &)
};

但是这里我们没有copy-constructor,所以出现了你报的错误,在ItemBad构造函数中使用初始化列表并不能解决问题,删除MyObject赋值也不能解决问题

ItemBad(int Number, MyObject *Object) {
   this->Number = Number;
   // AutoObject = std::unique_ptr<MyObject>(Object);  This comment doesn't solve the problem
}

unique_ptr如前所述更改为,或使用 boost shared_ptr

于 2012-09-27T15:52:23.280 回答