このコードはクラス外でうまく機能します-
const char* list[] = {"Author: ", "Label: ", "Price: ", "Date: "};
vector<string> vlist(list, list+4);
しかし、それをクラスに入れると、関数のように動作します-コンパイラはエラー「リスト」は型ではありません、エラー:「+」トークンなどの前に「、」または「...」が必要です??
一般的なパターンは次のとおりです。
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);
};
クラス内イニシャライザでは、配列サイズを自動的に推定することはできません。代わりに、サイズを指定する必要があります。
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を使用します。
クラス定義は関数を呼び出すことができず、宣言するだけであるため、エラーが発生します。クラスのコンストラクターで初期化リストを使用して、これを回避できます。
const char* list[] = { "Author: ", "Label: ", "Price: ", "Date: " };
class c
{
vector<string> vlist;
c() : vlist(list, list + 4) {}
}
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
。