2017-11-18 15 views
2

私は、このように初期化したい構造体を持っている:この構造体を集約初期化する方法は?

checkPoints someCheckpoints = { 
    { 
     mPosition(10, 18), 
     mPosition(15, 20), 
    }, 
    { 
     mPosition(45, 80), 
     mPosition(95, 105), 
    } 
}; 

基本的位置のベクトルは、アグリゲータを使用して初期化ベクトル。

これは問題なく動作します

std::vector<PosVec> someCheckpoints = { 
    { 
     mPosition(10, 18), 
     mPosition(15, 20), 
    }, 
    { 
     mPosition(45, 80), 
     mPosition(95, 105), 
    } 
}; 

私はいくつかの追加機能を追加するために構造体を使用する必要がありますが。

マイコード:

struct mPosition { 
    mPosition(int32_t x, int32_t y) : x(x), y(y) {} 

    int32_t x; 
    int32_t y; 
}; 

typedef std::vector<mPosition> PosVec; 

struct checkPoints { 
    explicit checkPoints(std::vector<PosVec>& checkPoints) { 
     checkPointsVec = checkPoints; 
    }; 

    const PosVec& getRandom() const { 
     return checkPointsVec[getRandomInt(0, checkPointsVec.size())]; 
    } 

    std::vector<PosVec> checkPointsVec; 
}; 

checkPoints someCheckpoints = { // no matching constructor 
    { 
     mPosition(10, 18), 
     mPosition(15, 20), 
    }, 
    { 
     mPosition(45, 80), 
     mPosition(95, 105), 
    } 
}; 

これはno matching constructorエラーを生成しています。適切なベクトルのような集約コンストラクタを使用したいと思います。私の構造体は、代わりにベクトルクラス を拡張する必要がありますか、私は自分のコンストラクタ(どちらの)を宣言することができるだろうか?

どうすればこの問題を解決できますか?

答えて

2

std::vectorは中括弧では表示されません。初期化で使用する場合はstd::initializer_listを使用しています。そしてconstが違いを生み出しています。だから私は書いてみたい

explicit checkPoints(const std::initializer_list<PosVec>& checkPoints) 
        ^~~~~  ^~~~~~~~~~~~~~~~ 

あなたのコンストラクタはリテラル定数をキャッチすることができます。

また、Jarod42 noted in commentsとして、explicitコンストラクタをcheckPoints a = {};のように呼び出すことはできません。あなたは、それが非const左辺値参照によってcatchedされることはありませんので、あなたはここで右辺値の初期化を使用していることに注意してください

checkPoints a { /* stuff */ }; 
checkPoints a (/* stuff */ }; 

のようにそれを呼び出すことができます。これは、左辺値参照または左辺値参照によってキャッチされます。

checkPoints someCheckpoints = { 
    { 
     mPosition(10, 18), 
     mPosition(15, 20), 
    }, 
    { 
     mPosition(45, 80), 
     mPosition(95, 105), 
    } 
}; // This is an rvalue! 

とにかく、それはあなたがそれで参照を変更しない場合のconstとしてパラメータを宣言することをお勧めします。

+0

explicit' 'と、それは'チェックポイントsomeCheckpoints {..}であろう(非 '=')ない – Jarod42

+0

と 'vector'と余分なブレースが必要になるでしょう。 'initializer_list'はそれを避けるでしょう。 – Jarod42

+0

'const'を追加しても問題は解決しません。 '明示的な'については '{..}'と '= {..}'のどちらかを使うことができます。私は意図的でない暗黙的な変換を避けるために、単一引数のコンストラクタにそのようにマークする必要があるため、これを使用しています。 – Kesse

0

コンストラクタは、このような、入力パラメータとしてstd::vector<PosVec>を必要とする:

 checkPoints someCheckpoints{ 
     std::vector<PosVec>{ 
     { 
      mPosition{10, 18}, 
      mPosition{15, 20}, 
     }, 
     { 
      mPosition{45, 80}, 
      mPosition{95, 105}, 
     } 
     } 
    }; 
関連する問題