我有这样定义的功能:
template <size_t SIZE>
double MyFun(std::function<double(std::array<double,SIZE>&)> f, std::array<double,SIZE> &x, std::array<double,SIZE> &y){
instructions;
}
和另一个函数,应该是前一个的参数,定义如下:
double MyFun2(std::array<double,3> &var){
instructions;
}
如果我尝试这样称呼“ MyFun”:
double something;
std::array<double,3> var = {...};
std::array<double,3> var2 = {...};
something = MyFun(MyFun2, var, var2);
我收到此错误:
error: no matching function for call to ‘MyFun(double (&)(std::array<double, 3>&), std::array<double, 3>&, std::array<double, 3>&)’
note: template argument deduction/substitution failed:
note: mismatched types ‘std::function<double(std::array<double, SIZE>&)>’ and ‘double (*)(std::array<double, 3>&)’
此外,如果我尝试将“ MyFun2”存储在带有“自动”的变量中
auto function = MyFun2;
赋予“功能”的类型是:
double (*function)(std::array<double, 3UL> &var)
而且我也不能使用“ function”作为MyFun的参数。我发现的唯一解决方案是通过指定正确的类型来对“ MyFun2”进行某种类型的转换:
double something;
std::array<double,3> var = {...};
std::array<double,3> var2 = {...};
std::function<double(std::array<double,3>&)> function = MyFun2;
something = MyFun(function, var, var2);
通过这种方式,将“功能”作为“ MyFun”的第一个参数传递。但是,为什么我会有这样的歧义,而不能仅通过输入MyFun2作为第一个参数来调用MyFun?为什么汽车不知道“正确”类型?
谢谢:)
您遇到no matching function for call to...
错误std::function
没有用于推断函数指针签名的推断指南。
为了创建std::function
的对象,需要使用std::bind(&MyFun2, std::placeholders::_1)
。供参考address cppreference 。
模板参数推导通过完全匹配您传入的参数来工作。它不考虑转换。