5

次のコードは gcc 4.7.0 でコンパイルされません (std=c++11 -O3 を使用)

int n;
std::vector< int[4] > A;
A.resize(n);

エラーメッセージは長いですが、最終的には

functional cast to array type ‘_ValueType {aka int[4]}‘

これは正しいです?またはこれをコンパイルする必要がありますか?さらに重要なことに、この問題を回避するにはどうすればよいでしょうか。(を保持する新しい構造体を定義せずにint[4])

編集:

C++98 の問題を解決するには?

4

3 に答える 3

9

ベクトルやその他のコンテナに配列を格納することはできません。コンテナに格納される要素のタイプ(コンテナの値型と呼ばれる)は、コピー構成可能かつ割り当て可能である必要があります。配列はどちらでもありません。

ただし、Boost、TR1、C++0xで提供されているような配列クラステンプレートを使用することはできます。

std::vector<std::array<type, size> >

(C++TR1に含まれているテンプレートを使用するにはstd::arrayをstd::tr1 :: arrayに置き換え、Boostライブラリのテンプレートを使用するにはboost :: arrayを置き換える必要があります。または、独自のテンプレートを作成することもできます。非常に簡単です。)

@source By:James McNellis

したがって、コードは次のようになります。

int n;
std::vector<std::array<int,3>> A;
A.resize(n);
于 2012-08-29T19:16:44.247 に答える
4

int[4] を保持する新しい構造体を定義せずに

不可能。std::array構造体 ( 、std::tr1::array、 )を定義または検索する必要がありますboost::array。そうしないと、このコードはコンパイルされません。

于 2012-08-29T19:09:18.373 に答える
2

23.1/3を参照してください。

これらのコンポーネントに格納されているオブジェクトのタイプは、CopyConstructibleタイプ(20.1.3)の要件、およびAssignableタイプの追加要件を満たしている必要があります。

したがって、C ++ 03vectorでは、含まれているアイテムがコピー構築可能である必要がありますが、Cスタイルの配列はそうではありません。エラーメッセージは正しく、コードはコンパイルに失敗するはずです。structベクトルのベクトル、配列をラップするためのa、またはstd::arrayC++11のベクトルを使用するだけです。

コピー構築可能な制限はC++11でコンテナ全体で解除されたと思います。また、Cスタイルの配列を1つに格納できるかどうか、またはより明示的に禁止されているかどうかはわかりません。

于 2012-08-29T19:17:49.487 に答える