[英]Invalid static_cast from type <unresolved overloaded function type>
[英]Why function pointer of overloaded function need static_cast?
对于下面的代码,我收到错误
#include <iostream>
#include <functional>
using namespace std;
class A {};
class B {};
namespace N
{
void func(A a, int z){}
void func(B a, int z){}
}
void func_1(std::function<void(A, int)> x)
{
A a;
x(a, 1);
}
int main()
{
func_1(N::func);
return 0;
}
错误:
main.cpp:23:19: error: cannot resolve overloaded function 'func' based on conversion to type 'std::function<void(A, int)>'
23 | func_1(N::func);
如果我们对func_1(N::func);
进行静态func_1(N::func);
作为func_1(static_cast<void (&)(A, int)>(N::func));
,那么这个工作正常。 但我希望这在没有演员的情况下工作。
std::function<void(A, int)>
比void(*)(A, int)
更复杂。
template< class F > function( F f );
用
std::move(f)
初始化目标。 如果f
是指向函数的空指针或指向成员的空指针,则调用后*this
将为空。 除非f
对于参数类型Args...
和返回类型R
是可调用的,否则此构造函数不参与重载决议。
在您决定哪个N::func
之前,您甚至不知道哪些构造函数参与了重载决议。
通过尝试std::function<void(A, int)>::function<void(*)(A, int)>
(任意多个)构造函数的其他有效实例。
问题比比皆是。
int g(A, int)
您还希望它能够选择int(*)(A, int)
int g(A, int)
。作为一种方便的解决方法,您可以提供这种func_1
重载。
...
void func_1(void(*x)(A, int))
{
func_1(std::function<void(A, int)>{x});
}
现在它可以在没有static_cast
情况下正常工作:演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.