ネストされたクラスのメンバー関数が完全な型を必要としないのはなぜですか?

scottxiao

例:

 class A
{
  class B
  {
    A c;//error!A is an incomplete type
    void test() { A b;/*OK,but why?*/ }
  };
};

コードスニペットは私には奇妙に思えますが、2つの使用法の違いはA何ですか?

ブライアン

[class.mem] / 6は、次のことを指定します。

クラスは}クラス指定子の終了時に完全に定義されたオブジェクト型(6.9)(または完全な型)と見なされますクラスmember-specification内では、クラスは関数本体、デフォルト引数、noexcept-specifiers、およびデフォルトメンバー初期化子(ネストされたクラスのようなものを含む)内で完全であると見なされます。それ以外の場合は、独自のクラスメンバー仕様内で不完全と見なされます

オブジェクトの定義(A b;またはのようにA c;)では、オブジェクトが完全な型を持っている必要があります。上記の段落で述べたように、クラスタイプは、特定の場所、つまりメンバー関数本体の内部やその他のいくつかの場所を除いて、独自の定義内では不完全です。

このルールにより、インラインで定義されたメンバー関数内に重要なコードを記述できると同時に、クラスがそれ自体を(直接的または間接的に)含むことを禁止できます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Javaで変数型として使用されていないクラスをインポートする必要がないのはなぜですか?

分類Dev

Flowがエクスポートされた関数のパラメーターのアノテーションを必要とするのはなぜですか?

分類Dev

派生したテンプレート化されたクラスの関数が、テンプレート化されていない基本クラスの純粋な仮想関数をオーバーライドしないのはなぜですか?

分類Dev

次のテンプレート化されたクラスメンバー関数がコンパイルされないのはなぜですか?

分類Dev

基本クラスのメンバーが、コンストラクターで最初に初期化された値を保持しないのはなぜですか?

分類Dev

PowerShellモジュールがメンバーを正しくエクスポートしないのはなぜですか?また、ネストされたモジュールをエクスポートしないのはなぜですか?

分類Dev

CRTP:派生クラスのネストされた型とネストされたメソッドの取得に違いがあるのはなぜですか?

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

このジェネリック関数のtypeパラメーターが指定された型を受け入れないのはなぜですか?

分類Dev

ベクトルがJavaクラスの長さ変数のようなメンバー変数としてサイズをサポートしないのはなぜですか?関数size()ではありませんか?

分類Dev

メンバー関数ポインタが、関数が実際に宣言したクラスに基づく型を持つのはなぜですか?

分類Dev

関数が型クラスによってのみ制約された型をとることができないのはなぜですか?

分類Dev

ネストされたクラスが、それを囲むクラスの1つであるタイプのメンバーを持つことができないのはなぜですか?

分類Dev

ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

分類Dev

ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

分類Dev

クラスの外部(ただしヘッダーファイル内)で定義されたクラスメンバー関数をインライン化する必要があるのはなぜですか?

分類Dev

ネストされた準クォートがスプライスアンクォートをアンラップしないのはなぜですか?

分類Dev

CreateWindow()関数が、クラス自体へのポインターではなく、WindowClassの名前メンバーを必要とするのはなぜですか?

分類Dev

「要素タイプが無効です:文字列(組み込みコンポーネントの場合)またはクラス/関数(複合コンポーネントの場合)が必要です...」というメッセージが表示されるのはなぜですか?

分類Dev

C ++で、(整数型の)非型テンプレートパラメーターの型のみが異なる、同じ名前の2つの関数/クラステンプレートが許可されないのはなぜですか?

分類Dev

ネストされたタイプの基本クラスに「typename」が必要でないのはなぜですか?

分類Dev

C ++で基本クラスへのポインターが与えられたときに、派生クラスオブジェクトのオーバーロードされた関数が呼び出されないのはなぜですか?

分類Dev

リンクされたライブラリの必要なバージョンが見つかるまで、Unix / Linuxシステムがディレクトリをトラバースしないのはなぜですか?

分類Dev

リンクされたライブラリの必要なバージョンが見つかるまで、Unix / Linuxシステムがディレクトリをトラバースしないのはなぜですか?

分類Dev

デフォルトのパラメーターを持つ関数をテンプレート化されたコンストラクターに渡して、ラムダを使用してstd :: function <void()>として保存しないのはなぜですか?

分類Dev

ネストされたコンストラクター。なぜそれが必要なのですか?

分類Dev

不完全な型が格納されているどのSTLデータ構造をクラスメンバーとして使用できますか?

分類Dev

不完全な型が格納されているどのSTLデータ構造をクラスメンバーとして使用できますか?

分類Dev

クラスメンバーの関数型をinvokeで呼び出す必要があるのはなぜですか?

Related 関連記事

  1. 1

    Javaで変数型として使用されていないクラスをインポートする必要がないのはなぜですか?

  2. 2

    Flowがエクスポートされた関数のパラメーターのアノテーションを必要とするのはなぜですか?

  3. 3

    派生したテンプレート化されたクラスの関数が、テンプレート化されていない基本クラスの純粋な仮想関数をオーバーライドしないのはなぜですか?

  4. 4

    次のテンプレート化されたクラスメンバー関数がコンパイルされないのはなぜですか?

  5. 5

    基本クラスのメンバーが、コンストラクターで最初に初期化された値を保持しないのはなぜですか?

  6. 6

    PowerShellモジュールがメンバーを正しくエクスポートしないのはなぜですか?また、ネストされたモジュールをエクスポートしないのはなぜですか?

  7. 7

    CRTP:派生クラスのネストされた型とネストされたメソッドの取得に違いがあるのはなぜですか?

  8. 8

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  9. 9

    このジェネリック関数のtypeパラメーターが指定された型を受け入れないのはなぜですか?

  10. 10

    ベクトルがJavaクラスの長さ変数のようなメンバー変数としてサイズをサポートしないのはなぜですか?関数size()ではありませんか?

  11. 11

    メンバー関数ポインタが、関数が実際に宣言したクラスに基づく型を持つのはなぜですか?

  12. 12

    関数が型クラスによってのみ制約された型をとることができないのはなぜですか?

  13. 13

    ネストされたクラスが、それを囲むクラスの1つであるタイプのメンバーを持つことができないのはなぜですか?

  14. 14

    ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

  15. 15

    ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

  16. 16

    クラスの外部(ただしヘッダーファイル内)で定義されたクラスメンバー関数をインライン化する必要があるのはなぜですか?

  17. 17

    ネストされた準クォートがスプライスアンクォートをアンラップしないのはなぜですか?

  18. 18

    CreateWindow()関数が、クラス自体へのポインターではなく、WindowClassの名前メンバーを必要とするのはなぜですか?

  19. 19

    「要素タイプが無効です:文字列(組み込みコンポーネントの場合)またはクラス/関数(複合コンポーネントの場合)が必要です...」というメッセージが表示されるのはなぜですか?

  20. 20

    C ++で、(整数型の)非型テンプレートパラメーターの型のみが異なる、同じ名前の2つの関数/クラステンプレートが許可されないのはなぜですか?

  21. 21

    ネストされたタイプの基本クラスに「typename」が必要でないのはなぜですか?

  22. 22

    C ++で基本クラスへのポインターが与えられたときに、派生クラスオブジェクトのオーバーロードされた関数が呼び出されないのはなぜですか?

  23. 23

    リンクされたライブラリの必要なバージョンが見つかるまで、Unix / Linuxシステムがディレクトリをトラバースしないのはなぜですか?

  24. 24

    リンクされたライブラリの必要なバージョンが見つかるまで、Unix / Linuxシステムがディレクトリをトラバースしないのはなぜですか?

  25. 25

    デフォルトのパラメーターを持つ関数をテンプレート化されたコンストラクターに渡して、ラムダを使用してstd :: function <void()>として保存しないのはなぜですか?

  26. 26

    ネストされたコンストラクター。なぜそれが必要なのですか?

  27. 27

    不完全な型が格納されているどのSTLデータ構造をクラスメンバーとして使用できますか?

  28. 28

    不完全な型が格納されているどのSTLデータ構造をクラスメンバーとして使用できますか?

  29. 29

    クラスメンバーの関数型をinvokeで呼び出す必要があるのはなぜですか?

ホットタグ

アーカイブ