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. 前のロジックが適用されると、と同じ式の置換が得られますItemGood

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

しかし、ここにはコピーコンストラクターがないため、報告されたエラーが発生します。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 に答える