我的课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,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
我在这里做错了什么?
的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>>
直接由它构造。
为了使其正常工作,您将需要通过以下方式之一进行更新:
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向量: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] 删除。
我来说两句