1

libc++ リストの実装にバグを見つけたと思います。次のコードは、xcode で特定のビルド設定を使用すると、コンパイラ エラー (Field has incomlete type 'foo') を生成します。

#include <list>

using namespace std;

class foo {
    public:
        list<foo> bar;
};

設定は次のとおりです。

XCode バージョン: 4.4.1
C++ 言語方言: C++11 または GNU++11
C++ 標準ライブラリ: C++ 拡張機能を備えた LLVM C++ 標準ライブラリ (libc++11)

GCC libstdc++ を使用すると、エラーが解決されます。
C++11 の方言を使用しないと、エラーが解決されます。
リストの代わりにベクトルを使用すると、エラーが解決されます。

リスト実装のバグだと思いますが、よくわかりません。
無知で申し訳ありませんが、この問題を解決するために何をすべきかわかりません。
ベクトルへの切り替えは私のプロジェクトではオプションではなく、C++11 の機能が絶対に必要です。これには shared_ptr も含まれますが、GCC を使用するとヘッダーが欠落します。それに加えて、Apple はもはや GCC の新しいバージョンを提供していないようです。

おそらくlibc ++の新しいヘッダーを使用して、誰かがこの問題を再現できれば幸いです。

また、LLVM/libc++ を更新するとこの問題が解決する場合、それをお勧めしますか?

4

1 に答える 1

3

C++ 標準 17.6.4.8:

場合によっては (置換関数、ハンドラー関数、標準ライブラリ テンプレート コンポーネントのインスタンス化に使用される型の操作)、C++ 標準ライブラリは C++ プログラムによって提供されるコンポーネントに依存します。これらのコンポーネントが要件を満たさない場合、標準は実装に要件を課しません。

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

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

を含む標準ライブラリのコンテナ クラス テンプレートのlistいずれも、不完全な型に対するそのような許可について言及していません。したがって、あなたのプログラムは無効なものであり、一部のコンパイラで動作する可能性があります。これは、標準ライブラリの実装のバグとは見なされません。

于 2012-09-15T04:46:48.643 に答える