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);
}
请注意,您还忘记了在呼叫站点访问 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
我正在调用一个基于模板的函数,它在函数和结构之间共享一个类型。这段代码有什么问题?为什么我编译时会收到错误消息?
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);
}
请注意,您还忘记了在呼叫站点访问 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