1

このコードはクラス外でうまく機能します-

const char* list[] = {"Author: ", "Label: ", "Price: ", "Date: "};
vector<string> vlist(list, list+4);

しかし、それをクラスに入れると、関数のように動作します-コンパイラはエラー「リ​​スト」は型ではありません、エラー:「+」トークンなどの前に「、」または「...」が必要です??

4

4 に答える 4

1

一般的なパターンは次のとおりです。

class MyClass {
public:
   template<class It>
   MyClass(It beg, It end) : vec(beg,end) { }

private:
   std::vector<std::string> vec;
 };
int main() {
   std::string s[] = { "abc", "bcd" };
   MyClass c(s, s+2);
};
于 2012-12-01T17:32:09.647 に答える
1

クラス内イニシャライザでは、配列サイズを自動的に推定することはできません。代わりに、サイズを指定する必要があります。

const char* list[4] = {"Author: ", "Label: ", "Price: ", "Date: "};

メンバーvlistは一時的に初期化できます。

vector<string> vlist = vector<string>(list, list + 4);

しかし、それは非効率な場合があります。一時的なものを避けるために、代わりにコンストラクターで初期化することをお勧めします。

ただし、プレーンlist配列がまったく必要ですか? そうでない場合は、代わりにこれを行う方がはるかに簡単です。

vector<string> list = {"Author: ", "Label: ", "Price: ", "Date: "};

また、コンパイラで C++11 モードが有効になっていることを確認する必要があります。-std=c++11または-std=g++11(GNU拡張の場合)コンパイラフラグになるGCCまたはClangを使用します。

于 2012-12-01T17:32:14.923 に答える
1

クラス定義は関数を呼び出すことができず、宣言するだけであるため、エラーが発生します。クラスのコンストラクターで初期化リストを使用して、これを回避できます。

const char* list[] = { "Author: ", "Label: ", "Price: ", "Date: " };

class c
{
    vector<string> vlist;
    c() : vlist(list, list + 4) {}
}
于 2012-12-01T17:33:30.637 に答える
0

C++11 を使用している場合は、ベクトルを初期化子 listで直接初期化できます。

vector<string> vlist {"Author: ", "Label: ", "Price: ", "Date: "};

そうでない場合は、コンストラクターで行う必要があります。おそらく次の方法で行いpush_backます。

Class::Class() {
    vlist.push_back("Author :");
    vlist.push_back("Label :");
    vlist.push_back("Price :");
    vlist.push_back("Date :");
}

とにかく、最終的に を使用する場合は、中間の C スタイルのテーブルを作成しても意味がありませんvector

于 2012-12-01T17:31:19.783 に答える