无法在委托构造函数中从初始值设定项列表初始化向量



我有一个类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
};

我尝试使用上面的委托构造函数,因为我希望MyClass的实例由std::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,
|              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~

我在这里做错了什么?

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>>构建。

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

  1. 将您的CCD_ 11更新为CCD_
  2. 只使用std::vector<std::vector<float>>构造函数,而忽略完全使用initializer_list1,或者
  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
    }
    
    编辑:由于此问题是关于委派构造函数提出的,因此您将首先显式构建一个临时向量:
    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构造函数,而在实现中正确使用移动语义。

如果您正确地使用了std::move,那么这个构造函数无论如何都应该相对便宜——这可能会使初始值设定项列表功能免费提供。

std::initializer_list中需要floats的向量;

我相信这就是你想要的

class MyClass{
public:
MyClass(vector<vector<float>> arg ): vec( arg) {
// some code here
}
MyClass(std::initializer_list<std::vector<float>> arg) 
: vec( arg ) {}; 

// other class members
private:
std::vector<vector<float>> vec;
};

最新更新