std::initializer_list 和 std::make_shared:参数太多...预期 3 个,提供 0 个
std::initializer_list and std::make_shared: too many arguments ... 3 expected 0 provided
我并没有真正从这些错误消息中变得更聪明。
Minimal (not) Working Example on godbolt
#include <initializer_list>
#include <memory>
#include <vector>
struct S
{
int j;
double y;
std::vector<int> data;
S(int i, double x, std::initializer_list<int> list)
: j(i)
, y(x)
, data(list)
{
}
};
int main()
{
auto ptr = std::make_shared<S>(1, 1.2, {1,2,3}); // I want this to work
// auto ptr = std::make_shared<S>(1, 1.2, std::initializer_list<int>({1,2,3})); // works
}
错误:
<source>:22:35: error: too many arguments to function 'std::shared_ptr<_Tp> std::make_shared(_Args&& ...) [with _Tp = S; _Args = {}]'
22 | auto ptr = std::make_shared<S>(1, 1.2, {1,2,3});
<source>:11:5: note: candidate: 'S::S(int, double, std::initializer_list<int>)'
11 | S(int i, double x, std::initializer_list<int> list)
| ^
<source>:11:5: note: candidate expects 3 arguments, 0 provided
当我在 {1,2,3}
前面调用 std::initializer_list<int>
的显式构造函数时,它编译得很好。有什么办法可以避免这种情况,这样我的 std::make_shared
就不会膨胀这么多吗?
{1,2,3}
可以是多个东西,make_shared不可能在参数包展开的时候知道是什么。
如果您不想明确说明长 std::initializer_list<int>{1,2,3}
,最简单的解决方案是:
一种。缩短类型名称:using ints=std::initializer_list<int>;
b.结束通话:
auto make_shared_S(int x, double y, std::initializer_list<int> l)
{
return std::make_shared<S>(x, y, l);
}
我并没有真正从这些错误消息中变得更聪明。
Minimal (not) Working Example on godbolt
#include <initializer_list>
#include <memory>
#include <vector>
struct S
{
int j;
double y;
std::vector<int> data;
S(int i, double x, std::initializer_list<int> list)
: j(i)
, y(x)
, data(list)
{
}
};
int main()
{
auto ptr = std::make_shared<S>(1, 1.2, {1,2,3}); // I want this to work
// auto ptr = std::make_shared<S>(1, 1.2, std::initializer_list<int>({1,2,3})); // works
}
错误:
<source>:22:35: error: too many arguments to function 'std::shared_ptr<_Tp> std::make_shared(_Args&& ...) [with _Tp = S; _Args = {}]'
22 | auto ptr = std::make_shared<S>(1, 1.2, {1,2,3});
<source>:11:5: note: candidate: 'S::S(int, double, std::initializer_list<int>)'
11 | S(int i, double x, std::initializer_list<int> list)
| ^
<source>:11:5: note: candidate expects 3 arguments, 0 provided
当我在 {1,2,3}
前面调用 std::initializer_list<int>
的显式构造函数时,它编译得很好。有什么办法可以避免这种情况,这样我的 std::make_shared
就不会膨胀这么多吗?
{1,2,3}
可以是多个东西,make_shared不可能在参数包展开的时候知道是什么。
如果您不想明确说明长 std::initializer_list<int>{1,2,3}
,最简单的解决方案是:
一种。缩短类型名称:using ints=std::initializer_list<int>;
b.结束通话:
auto make_shared_S(int x, double y, std::initializer_list<int> l)
{
return std::make_shared<S>(x, y, l);
}