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 模式。使用 GCC 或 Clang 将是-std=c++11-std=g++11(对于 GNU 扩展)编译器标志。

于 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,您可以通过初始化列表直接初始化您的向量:

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 :");
}

无论如何,如果最终您要使用vector.

于 2012-12-01T17:31:19.783 回答