无法从委派构造函数的初始化列表中初始化向量

火车心网

我的课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
};

我试图在上面使用委托的构造函数,因为我希望MyClassstd::initializer_list<std::initializer_list<float>>vector<vector<float>>类型构造一个实例,并且构造函数代码块是相同的。因此,我试图通过初始化多维向量并使用其构造函数来委派嵌套初始化列表的构造。

但是,上面的代码给了我一个编译器错误:

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,
      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~

我在这里做错了什么?

人工编译器

的initializer_list构造函数std::vector如下所示:

vector(std::initializer_list<value_type>)

value_type的第一个模板参数在哪里std::vector在这种情况下,std::vector<std::vector<float>>具有value_type = std::vector<float>-意味着只能std::initializer_list<std::vector<float>>直接由它构造

为了使其正常工作,您将需要通过以下方式之一进行更新:

  1. 更新你的std::initializer_liststd::initializer_list<std::vector<float>>
  2. 只需使用std::vector<std::vector<float>>构造函数,而忽略initializer_list全部使用1,或者
  3. 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向量:
    MyClass(std::initializer_list<std::initializer_list<float>> arg)
      : MyClass{std::vector<std::vector<float>>{arg.begin(), arg.end()}} 
    
    在这种情况下,委派构造函数可能不是解决问题的最佳方法。见下文。

1由于std::vector已经可以正确地使用初始化列表,即使嵌套在其他类型中,也可能最简单的方法是完全忽略添加显式std::initializer_list构造函数,而在实现中正确使用move语义。

如果使用std::move得当,则此构造函数无论如何都应该相对便宜-这可以使初始化列表功能免费提供。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

向量构造函数对:初始化列表与显式构造

空向量的构造函数列表初始化

如何在varargs构造函数的初始值设定项列表中初始化向量?

委派列出初始化的构造函数,空字段

在类构造函数中初始化const向量(C ++)

在构造函数 C++ 中初始化结构向量

在 sfml 的构造函数中初始化向量数组

使用初始化列表在构造函数中初始化复杂映射

C ++初始化构造函数初始化器列表中的模板数组

C ++初始化字段直接与默认构造函数中的初始化列表

构造函数初始化列表中POD类型的初始化

在构造函数初始化列表中初始化std :: vector数组

我如何在初始化列表中的构造函数之后初始化变量/对象?

初始化列表与向量

构造函数初始化列表中的循环依赖

如何在构造函数中初始化列表?

初始化列表中的复制构造

在构造函数中初始化日历

在构造函数中初始化流

无法在复制构造函数中初始化数组

向量无法初始化

在类声明或构造函数初始化器列表中初始化简单成员

是否可以在构造函数体内而不是初始化列表中初始化成员变量?

无法初始化向量来保存使用其构造函数初始化的另一个类

基本/默认构造函数与构造函数初始化列表

如何使用嵌套初始化构造函数中的1d向量初始化矩阵?

声明初始化与构造函数初始化

无法在初始化列表中捕获

使用构造函数的参数初始化向量成员