gpt4 book ai didi

c++ - std::initializer_list 和 std::make_shared: 参数太多...预期 3 提供 0

转载 作者:行者123 更新时间:2023-12-05 03:28:55 29 4
gpt4 key购买 nike

我并没有真正从这些错误消息中变得更聪明。

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

当我为 std::initializer_list<int> 调用显式构造函数时,它编译得很好在 {1,2,3} 前.有没有办法绕过这个,所以我的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);
}

演示:https://godbolt.org/z/WErz87Ks4

关于c++ - std::initializer_list 和 std::make_shared: 参数太多...预期 3 提供 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71138329/

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