std :: function and error:没有匹配函数用于调用

时间:2017-02-21 12:20:33

标签: c++ c++11 templates std-function

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

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;
                               ^

2 个答案:

答案 0 :(得分:3)

你的代码有点混乱,但总是一个解决方案。

#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

您可以在此处尝试/测试新代码:http://cpp.sh/33cpn

答案 1 :(得分:2)

template<typename T>
int calculate(
    mystruct<T> custom_struct,
    std::function<T(T)> custom_func);

编译器将尝试从T以及std::function<T(T)>推导出mystruct<T>,但从函数指针中扣除失败。一种解决方案是在std::function<T(T)>上禁用模板推导,使其成为非推导的上下文:

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)

但是,在这种情况下,您应该使用TemplateRex's solution,因为std::function附带了一堆您实际上并不需要的开销,除非您想要将其存储在某处。