-2

次のコードはビルドされません。

struct some_struct {
    some_struct() {
      ... do something here to specify size of v; how ??
    }
    enum {
       ZERO,
       ONE,
       TWO
    };

    static std::vector<std::string> v(TWO);
};

アイデアに感謝します。これが違法な使用であることを示唆するものは何もないようです。

タイプミス:ベクトル構文と修正を修正しました:私は2010年ではなく2005/2008年にのみテストしました。質問した人へのエラーメッセージ:

error C2061: syntax error : identifier 'TWO'

さらに編集:

コンパイラvは、型を返す関数であると考えているようstd::vector<std::string>です。これはすべてaの中にありますstruct(これをさらに明確にするために、投稿をさらに修正しました)。おそらく、型と混同するsize引数を省略し、コンストラクターのどこかでサイズを宣言する必要がありますか?このベクトルが構造体の静的データメンバーになることを意味しました。コンパイラにこれを理解させるにはどうすればよいですか?

注:Linuxでは、元々持っていたものに似たスタンドアロンコードでテストしました(構造体なし)...したがって、この修正を行ったLinuxではコンパイルされない可能性があります。そこで、Linuxで問題なく構築されたというコメントを削除しました。謝罪。

4

3 に答える 3

2

クラス宣言でクラスメンバーを初期化することはできません。外部でインスタンス化する必要があります。

#include <vector>
#include <string>

struct some_struct {
    some_struct() {
    }
    enum {
       ZERO,
       ONE,
       TWO
    };

    static std::vector<std::string> v;
};

std::vector<std::string>
some_struct::v = std::vector<std::string>(TWO);

int main() {}
于 2012-06-27T22:05:50.663 に答える
0

そのようなヘッダーのベクトルを初期化することはできません。静的であるため、ソースファイルで、宣言されている場所で実行します。

std::vector<std::string> some_struct::v(TWO);

静的でない場合は、クラスコンストラクターの初期化リストで行います。

于 2012-06-27T22:14:21.617 に答える
0

注:以下のすべては、元の質問に対するOPの修正によって無効になります。

それはすべて、どこvectorから定義を取得したかによって異なります。vector<>テンプレート(または最近ではテンプレート)を定義する標準のC ++ #includeファイルをどこかにインクルードした場合std::vector<>、テンプレートとして定義されているがタイプが指定されていないため、エラーが発生します。それは次のようなものを期待しています:

std::vector<int> v;

途中で標準ファイルを含めなかった場合、それはどこかからベクトルの定義を取得しており、Lordはそれが期待するコンストラクター引数の種類しか知りません。

とにかく、クラスとしてのベクトルは非標準であり、宣言と実装が環境ごとに異なる(または存在しない)場合でも驚くことではありません。

于 2012-06-27T21:10:52.950 に答える