6

次のエラーが発生します。

class Test
{
    std::map<std::string,Test> test;
};

エラーは「フィールドの型 'Test' が不完全です」です。これは、xcode に同梱されている libcxx のバージョンのバグである可能性があると示唆されたいくつかのスレッドを読みましたが、次のように変更する必要がある場合でも、まったく驚かないでしょう。

class Test
{
    std::map<std::string,std::shared_ptr<Test>> test;
};

これが間違いなく正しいエラーであり、バグではないことを再確認したかっただけです。

乾杯!

4

1 に答える 1

9

標準では、特に明記されていない限り、標準ライブラリのテンプレート コンポーネントで使用されるすべての型が完全である必要があります。したがって、libc++ のエラーは正しいです。不完全型の使用は未定義の動作 (§17.6.4.8[res.on.functions]/2) であるため、それを受け入れる libstdc++ も間違っていません。

ポインター オブジェクトを使用して、完全な型を構築することができます。ただし、不完全な型を許可するサードパーティのコレクション ライブラリを使用することもできます。たとえば、不完全な型を許可するようboost::container::map設計されています


§17.6.4.8 その他の機能 / 2:

特に、次の場合の効果は定義されていません。

  • ...

  • そのコンポーネントに対して特に許可されていない限り、テンプレート コンポーネントをインスタンス化するときに、不完全型 (3.9) がテンプレート引数として使用された場合。

(不完全な型を明示的に許可する唯一のコンポーネントdeclvalunique_ptr、、、、およびdefault_deleteです。)shared_ptrweak_ptrenable_shared_from_this

于 2012-09-06T08:17:52.420 に答える