std::function and error: no matching function for call to

std::function and error: no matching function for call to

我正在调用一个基于模板的函数,它在函数和结构之间共享一个类型。这段代码有什么问题?为什么我编译时会收到错误消息?

test.cpp

#include <functional>
#include <iostream>

template<typename T>
struct mystruct
{
    T variable;
};

int myfunc(int x)
{
    return 2*x;
}

template<typename T>
T calculate(
    mystruct<T> custom_struct,
    std::function<T(T)> custom_func)
{
    return custom_func(custom_struct.variable);
}

int main()
{
    mystruct<int> A;
    A.variable=6;
    std::cout<<calculate(A,myfunc)<<std::endl;
    return 0;
}

编译结果:

test.cpp:25:31: error: no matching function for call to ‘calculate(mystruct<int>&, int (&)(int))’
  std::cout<<calculate(A,myfunc)<<std::endl;
                               ^
template<typename T>
int calculate(
    mystruct<T> custom_struct,
    std::function<T(T)> custom_func);

编译器将尝试从 std::function<T(T)>mystruct<T> 中推导 T,但从函数指针推导失败。一种解决方案是通过将 std::function<T(T)> 设为 non-deduced 上下文来禁用模板推导:

template <typename T> struct identity { using type = T; };
template <typename T> using identity_t = typename identity<T>::type; 

template<typename T>
int calculate(
    mystruct<T> custom_struct,
    identity_t<std::function<T(T)>> custom_func)
{
    return custom_func(custom_struct.variable);
}

虽然它使函数签名有点丑陋,但您仍然可以推导出 T,因此您可以只调用 calculate(A,myfunc) 而不是 calculate<int>(A,myfunc)

但是,在这种情况下,您应该使用 ,因为 std::function 会带来大量开销,除非您想将其存储在某个地方,否则您实际上并不需要这些开销。

没有理由使用 std::function 包装器。而是使用通用模板参数 F

template<typename T, class F>
T calculate(
    mystruct<T> custom_struct,
    F custom_func)
{
    return custom_func(custom_struct.variable);
}

Live Example

请注意,您还忘记了在呼叫站点访问 variable 成员。 由于您在这里进行泛型编程,因此您还希望 return 类型等于 T,甚至 auto(C++14,对于 C++11,您可能希望使用decltype 但重复太多了)。

您在 calculate() 中错误地将 custom_struct 传递给了 custom_func

尝试传递 custom_struct.variable

template<typename T>
int calculate(
    mystruct<T> custom_struct,
    std::function<T(T)> custom_func)
{
    return custom_func(custom_struct.variable);
}

也在 ideone

你的代码有点乱,但总有解决办法。

#include <functional>
#include <iostream>

template<typename T>
struct mystruct
{
    T variable;
};

const int myfunc(const int & x)
{
    return 2*x;
}

template<typename T>
T calculate(
    mystruct<T> custom_struct,
    std::function<T(T)> custom_func)
{
    return custom_func(custom_struct.variable);
}

int main()
{
    mystruct<int> A;
    A.variable=6;
    std::cout<<calculate<int>(A,myfunc)<<std::endl;
    return 0;
}

return custom_func(custom_struct) 有问题,您必须从该结构传递 variable 成员并添加 calculate<int> 而不是 calculate

您可以 try/test 此处的新代码:http://cpp.sh/33cpn