如何在 C++ 中支撑自定义 class 的初始化向量?
how to brace initialize vector of custom class in C++?
有这个简单的代码:
#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
的向量可以进行大括号初始化,而带有隐式构造函数(带有 std::string
)的自定义 class 却不能?以及如何启用它?
您可以添加另一个接受 const char*
的构造函数到您的 class,它应该可以工作
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;
};
或其他答案中建议的附加括号。
你只需要更多牙套:
std::vector<Person> persons = {
{"John"}, {"David"}, {"Peter"}
};
问题是您在初始化列表中使用了 (C-style) 个字符串文字,但向量包含 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"}};
}
有这个简单的代码:
#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
的向量可以进行大括号初始化,而带有隐式构造函数(带有 std::string
)的自定义 class 却不能?以及如何启用它?
您可以添加另一个接受 const char*
的构造函数到您的 class,它应该可以工作
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;
};
或其他答案中建议的附加括号。
你只需要更多牙套:
std::vector<Person> persons = {
{"John"}, {"David"}, {"Peter"}
};
问题是您在初始化列表中使用了 (C-style) 个字符串文字,但向量包含 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"}};
}