std ::具有模板的函数,类型问题,没有匹配的调用函数

问题描述 投票:2回答:3

我有这样定义的功能:

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?为什么汽车不知道“正确”类型?

谢谢:)

c++ templates types auto std-function
3个回答
1
投票

您遇到no matching function for call to...错误std::function没有用于推断函数指针签名的推断指南。


1
投票

为了创建std::function的对象,需要使用std::bind(&MyFun2, std::placeholders::_1)。供参考address cppreference


0
投票

模板参数推导通过完全匹配您传入的参数来工作。它不考虑转换。

© www.soinside.com 2019 - 2024. All rights reserved.