为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)

Why am I getting this error? Could not convert {lb, ub} from <brace-enclosed initializer list> to float(**)(float*, int)

本文关键字:float 列表 gt 转换 int 起来 ub lb 为什么 错误 lt      更新时间:2023-10-16

我有一个返回此错误的函数原型。我还收到扩展列表的警告,用于-std=c++11-std=gnu++11

float lb(float* data, int y);
float ub (float* data, int y);
float operation(Stats* ptr, float* data, int y, float(*fp[])(float*, int) = {lb, ub});

数组衰减到函数声明中的指针(如果您不通过引用获取它(。你可以做的是将默认值包装在一个常量中,就像这样(请注意,如果你不将其作为额外的参数传递,你会用这种方法丢失数组大小(:

using OperationType = float(*)(float*, int);
constexpr OperationType DefaultOperations[] = {lb, ub};
float operation(Stats* ptr, float* data, int y, const OperationType* fp = DefaultOperations);

如果你总是知道编译时数组的大小,你可以使用这样的std::array

using OperationType = float(*)(float*, int);
template <std::size_t Size>
float operation(Stats* ptr, float* data, int y, std::array<OperationType, Size> fp = {lb, ub});

您将[]视为数组的声明。但在函数参数中,它只声明一个指针。

试试这个:

typedef float(*fp[])(float*, int);
float operation(Stats* ptr, float* data, int y, fp pfp = (fp) {lb, ub});

而不是这种丑陋的语法,你实际上可以使用typedef'd std::functions的向量。它看起来会更好,编译得很好。

#include <functional>
#include <vector>
float lb(float* data, int y) { return 0; }
float ub(float* data, int y) { return 0; }
typedef std::function<float (float*, int)> Func;
float operation(void* ptr, float* data, int y, std::vector<Func> funcs = { lb, ub }) { return 0;  } 
/* didn't declare stats, so I use void here instead */
int main(int argc, char* argv[])
{
operation(nullptr, nullptr, 0);
return 0;
}