gpt4 book ai didi

c++ - 无法在委托(delegate)构造函数中从初始化列表初始化 vector

转载 作者:行者123 更新时间:2023-12-03 06:57:54 30 4
gpt4 key购买 nike

我有课MyClass如下:

class MyClass {
public:
MyClass(vector<vector<float>> arg) {
// some code here
}
MyClass(std::initializer_list<std::initializer_list<float>> arg)
: MyClass(vector<vector<float>>(arg)) {
}
// other class members
};
我正在尝试使用上面的委托(delegate)构造函数,因为我想要 MyClass 的实例由 std::initializer_list<std::initializer_list<float>> 构成和 vector<vector<float>>类型和构造函数代码块是相同的。所以我试图通过初始化一个多维 vector 并使用它的构造函数来委托(delegate)嵌套初始化列表的构造。
但是,上面的代码给了我一个编译器错误:
no instance of constructor "std::__1::vector<_Tp, _Allocator>::vector [with _Tp=std::__1::vector<float, std::__1::allocator<float>>, _Allocator=std::__1::allocator<std::__1::vector<float, std::__1::allocator<float>>>]" matches the argument list -- argument types are: (std::initializer_list<std::initializer_list<float>>)
In file included from /opt/wandbox/gcc-9.3.0/include/c++/9.3.0/vector:67,
from prog.cc:11:
/opt/wandbox/gcc-9.3.0/include/c++/9.3.0/bits/stl_vector.h:622:7: note: candidate: 'std::vector<_Tp, _Alloc>::vector(std::initializer_list<_Tp>, const allocator_type&) [with _Tp = std::vector<float>; _Alloc = std::allocator<std::vector<float> >; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<std::vector<float> >]'
622 | vector(initializer_list<value_type> __l,
| ^~~~~~
/opt/wandbox/gcc-9.3.0/include/c++/9.3.0/bits/stl_vector.h:622:43: note: no known conversion for argument 1 from 'initializer_list<std::initializer_list<float>>' to 'initializer_list<std::vector<float>>'
622 | vector(initializer_list<value_type> __l,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
我在这里做错了什么?

最佳答案

std::vector 的 initializer_list 构造函数好像:

vector(std::initializer_list<value_type>)
在哪里 value_typestd::vector 的第一个模板参数.在这种情况下, std::vector<std::vector<float>>value_type = std::vector<float> -- 这意味着它只能由 std::initializer_list<std::vector<float>> 构造直接地。
为了使其正常工作,您需要通过以下方式之一进行更新:
  • 更新您的 std::initializer_list成为 std::initializer_list<std::vector<float>> ,
  • 只需使用 std::vector<std::vector<float>>构造函数并使用 initializer_list 忽略完全1,或
  • 范围构造来自 initializer_list<initializer_list<float>>在构造函数中:
    MyClass(std::initializer_list<std::initializer_list<float>> arg)
    : vec{arg.begin(), arg.end()}
    {
    // each iterator points to an initializer_list, which implicitly
    // constructs each vector
    }
    编辑:由于这个问题是关于委派构造函数的,所以你会首先明确地构造一个临时 vector vector :
    MyClass(std::initializer_list<std::initializer_list<float>> arg)
    : MyClass{std::vector<std::vector<float>>{arg.begin(), arg.end()}}
    在这种情况下,委托(delegate)构造函数可能不是解决问题的最佳方法。见下文。

  • 1 自 std::vector已经在初始化列表中正常工作,即使嵌套在其他类型中,最简单的方法可能是忽略添加显式 std::initializer_list完全构造函数——并且在实现中正确使用移动语义。
    如果您使用 std::move正确地,无论如何,这个构造函数应该相对便宜——这可以使初始化列表功能免费。

    关于c++ - 无法在委托(delegate)构造函数中从初始化列表初始化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63797259/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com