拥有以下简单代码:
#include <iostream>
#include <vector>
#include <string>
class Person{
public:
Person(std::string const& name) : name(name) {}
std::string const& getName() const {
return name;
}
private:
std::string name;
};
int main(){
// std::vector<int> ar = {1,2,3};
std::vector<Person> persons = {"John", "David", "Peter"};
}
我收到错误:
could not convert ‘{"John", "David", "Peter"}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Person>’
那么,为什么int
s的向量能够进行大括号初始化,而具有隐式构造函数的自定义类(具有std::string
(却不能呢?如何启用它?
您只需要更多的大括号:
std::vector<Person> persons = {
{"John"}, {"David"}, {"Peter"}
};
问题是在初始化列表中使用(C样式(字符串文字,但矢量包含std::string
。解决此问题的一种方法是传递std::string
对象。这里有一种方法:
int main(){
using namespace std::string_literals;
std::vector<Person> persons = {"John"s, "David"s, "Peter"s};
}
或者,您可以为每个对象使用大括号初始化器,如另一个答案所建议的:
int main(){
std::vector<Person> persons = {{"John"}, {"David"}, {"Peter"}};
}
您可以向类中添加另一个接受const char*
的构造函数,它应该可以在中工作
class Person{
public:
Person(const char* name): Person(std::string(name)) {}
Person(std::string const& name) : name(name) {}
std::string const& getName() const {
return name;
}
private:
std::string name;
};
或者像另一个答案中建议的那样,加上括号。