構造体の初期化での暗黙的なコピーコンストラクターのエラー

パウロ・ネベス

私はC ++の知識に照らして説明できない問題を思いつきました。

タイプXの構造体への定数参照をとるクラスがありますが、タイプX(以前に初期化したもの)の引数を渡すと、コンパイラーから、メンバーの最初のメンバーに変換できないというエラーが表示されます。 Xの。これは私には意味がありません。

エラーはclangとg ++で似ているため、ひどいものが欠けていると思います。

error: no viable conversion from 'const Foo::X' to 'Foo::FooTypes'

XからZの最初のメンバーであるFooTypesに変換しようとしているのはなぜですか?

class Foo {
public:
    enum FooTypes {
        JPEG
    };
    struct Z {
        FooTypes type;
        int a;
    };

    struct X {
        Z caps;
        double host_address;
    };
    Foo(const X& x);
private:
    const X x;
};

Foo::Foo(const Foo::X& x) :
                x{x}    {
}
int main() {
    Foo::X new_x = {
        {Foo::JPEG, 1}, 1.58 };
    Foo *s = new Foo(new_x);
    delete s;
    return 0;
}
ニックK

中括弧の代わりに丸括弧を使用する必要があります。

...
    const X m_x;
};
Foo::Foo(const Foo::X& x) :
    m_x(x) {
}
...

リストの初期化は次のとおりです。

...
m_x{x.caps, x.host_address}
...

@PauloNevesを編集します。BjarneStroustrupのドキュメントhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdfを見つけましたこれには、次の定義が含まれています。

「初期化子リスト」の一般的な考え方(EWGで長年議論されているように)は、初期化子を許可するすべてのコンテキストで、中括弧で囲まれた式のリストを使用できるようにすることです。次のリストはN2532から削除されました。

  • 変数の初期化; 例:X x {v};
  • 一時的なものの初期化; 例:X {v}
  • 明示的な型変換; 例:x X {v};
  • 無料の店舗割り当て。例:p new X {v}
  • 戻り値; 例:X f(){/ * ... * / return {v}; }
  • 引数の受け渡し; 例:void f(X); /* ... */ F V});
  • ベースの初期化; 例:Y :: Y(v):X {v} {/ * ... * /};
  • メンバーの初期化; 例:Y :: Y(v):mx {v} {X mx; / * ... * /};

説明されているメンバーの初期化はあなたのケースだと思います。だから私にとってはg ++ 4.9の欠陥のように見えます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

暗黙的/デフォルトのコピーコンストラクターがPOD構造体で失敗する原因は何ですか?

分類Dev

宣言された引数転送コンストラクターを使用した構造体の暗黙的なコピー

分類Dev

C ++コンストラクタ初期化リストのC構造体コピー

分類Dev

gfortranでの暗黙のdoを使用した配列コンストラクターの奇妙な初期化動作

分類Dev

暗黙の変換とコピーコンストラクタ

分類Dev

構造体の初期化のネストされた配列:両方の構造体のコンストラクターが使用可能な場合の方法

分類Dev

構造体コンストラクターまたは初期化

分類Dev

C ++コンストラクターの暗黙的な型変換

分類Dev

コンストラクターでのC ++の不要な暗黙的な変換

分類Dev

Scalaクラスコンストラクターの暗黙

分類Dev

このC構造体初期化コードがバスエラーを生成するのはなぜですか?

分類Dev

C ++基本クラス/構造体コンストラクターが派生から暗黙的に呼び出すことができる複数の引数を持つことができないのはなぜですか?

分類Dev

末尾に `this()`がある構造体コンストラクターとない構造体コンストラクターの違いは何ですか?

分類Dev

クラスコンストラクターでの構造体変数のパラメーターの定義

分類Dev

配列構造体にはパラメーターなしのコンストラクターが必要です

分類Dev

暗黙のコピーコンストラクタ/代入演算子でメンバーを抑制する方法は?

分類Dev

C ++コピーコンストラクターのように機能するC#構造体のコピーコンストラクター

分類Dev

暗黙的に削除されたコピーコンストラクターのコンパイルエラーがポインターの値を返す

分類Dev

C++ コンストラクターの暗黙的なメンバー

分類Dev

C ++での暗黙的な変換によるコピー初期化

分類Dev

D構造体コピーコンストラクタ

分類Dev

コンストラクターの最終初期化エラー

分類Dev

constメンバー構造体にコンストラクターが必要なのはなぜですか?

分類Dev

コピーコンストラクターが削除された構造体がPOD型ではないのはなぜですか?

分類Dev

Scalaでの暗黙の抽象クラスコンストラクターパラメーターと継承

分類Dev

クラスのostringstreamタイプのメンバーが、「暗黙的に削除されたコピーコンストラクターの呼び出し」エラーを引き起こすのはなぜですか?

分類Dev

コンストラクターの記述を伴わない新しい構造体変数を初期化する方法はありますか?

分類Dev

コンストラクターを使用して、定義された構造体へのポインターの配列を初期化する

分類Dev

C ++の暗黙的なデフォルトコンストラクターのポイントは何ですか?

Related 関連記事

  1. 1

    暗黙的/デフォルトのコピーコンストラクターがPOD構造体で失敗する原因は何ですか?

  2. 2

    宣言された引数転送コンストラクターを使用した構造体の暗黙的なコピー

  3. 3

    C ++コンストラクタ初期化リストのC構造体コピー

  4. 4

    gfortranでの暗黙のdoを使用した配列コンストラクターの奇妙な初期化動作

  5. 5

    暗黙の変換とコピーコンストラクタ

  6. 6

    構造体の初期化のネストされた配列:両方の構造体のコンストラクターが使用可能な場合の方法

  7. 7

    構造体コンストラクターまたは初期化

  8. 8

    C ++コンストラクターの暗黙的な型変換

  9. 9

    コンストラクターでのC ++の不要な暗黙的な変換

  10. 10

    Scalaクラスコンストラクターの暗黙

  11. 11

    このC構造体初期化コードがバスエラーを生成するのはなぜですか?

  12. 12

    C ++基本クラス/構造体コンストラクターが派生から暗黙的に呼び出すことができる複数の引数を持つことができないのはなぜですか?

  13. 13

    末尾に `this()`がある構造体コンストラクターとない構造体コンストラクターの違いは何ですか?

  14. 14

    クラスコンストラクターでの構造体変数のパラメーターの定義

  15. 15

    配列構造体にはパラメーターなしのコンストラクターが必要です

  16. 16

    暗黙のコピーコンストラクタ/代入演算子でメンバーを抑制する方法は?

  17. 17

    C ++コピーコンストラクターのように機能するC#構造体のコピーコンストラクター

  18. 18

    暗黙的に削除されたコピーコンストラクターのコンパイルエラーがポインターの値を返す

  19. 19

    C++ コンストラクターの暗黙的なメンバー

  20. 20

    C ++での暗黙的な変換によるコピー初期化

  21. 21

    D構造体コピーコンストラクタ

  22. 22

    コンストラクターの最終初期化エラー

  23. 23

    constメンバー構造体にコンストラクターが必要なのはなぜですか?

  24. 24

    コピーコンストラクターが削除された構造体がPOD型ではないのはなぜですか?

  25. 25

    Scalaでの暗黙の抽象クラスコンストラクターパラメーターと継承

  26. 26

    クラスのostringstreamタイプのメンバーが、「暗黙的に削除されたコピーコンストラクターの呼び出し」エラーを引き起こすのはなぜですか?

  27. 27

    コンストラクターの記述を伴わない新しい構造体変数を初期化する方法はありますか?

  28. 28

    コンストラクターを使用して、定義された構造体へのポインターの配列を初期化する

  29. 29

    C ++の暗黙的なデフォルトコンストラクターのポイントは何ですか?

ホットタグ

アーカイブ