使用std::initializer_list构造对象向量
我正在尝试按如下方式初始化一个对象向量 Col。
Col 类是使用一个 std::string 元素构造的。
为什么在我直接把 std::initializer_list<std::string> 传给 vector 时,下面的代码会编译失败?
如果我使用迭代器来构造对象向量,效果就没问题。
#include <initializer_list>
#include <vector>
#include <string>
class Col {
std::string m_name;
public:
explicit Col(const std::string& any_name) : m_name(any_name) {}
};
void foo(std::initializer_list<std::string> data) {
std::vector<Col> v(data);
}
void bar(std::initializer_list<std::string> data) {
std::vector<Col> v(data.begin(), data.end());
}
我正在使用 Visual Studio 2022,并且使用 C++17 进行编译。
我遇到的错误是:
error C2665: 'std::vector<Col,std::allocator<Col>>::vector':
no overloaded function could convert all the argument types
cannot convert argument 1 from 'std::initializer_list<std::string>' to 'std::initializer_list<_Ty>
with
[
_Ty=Dictionary::Col,
_Alloc=std::allocator<Dictionary::Col>
]
解决方案
你试图用一个由 std::string 构成的初始化列表来创建一个包含 Col 的向量。不存在从 std::initializer_list<std::string> 转换到一个 std::initializer_list<Col> 的隐式转换,尽管存在从 std::string 转换到 Col 的转换。这就是使用迭代器构造函数可行(从 std::string 转换到 Col 的转换),而不适用于接受初始化列表的构造函数的原因。
一般来说,除了都是 X 的实例化外,X<T> 与 X<U> 之间并不存在隐式关系。例如,也不存在从 std::vector<std::string> 直接转换到 std::vector<Col> 的转换(尽管你可以用指向字符串向量的迭代器来构造一个 std::vector<Col>)。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。