错误:无法将“<未解析的重载函数类型>”转换为“函数指针”
Posted
技术标签:
【中文标题】错误:无法将“<未解析的重载函数类型>”转换为“函数指针”【英文标题】:Error: cannot convert '<unresolved overloaded function type>' to 'function pointer' 【发布时间】:2020-10-25 18:38:38 【问题描述】:#include<iostream>
#include<bitset>
#include<string.h>
#include<string>
#include<vector>
#include<math.h>
#include<stdarg.h>
class b
public:
b();
void ef(void(*f)());
;
class d : public b
public:
d();
void print();
;
b::b()
void b::ef(void(*f)()) f();
d::d(): b()
void d::print() cout<<"WORKS"<<endl;
int main()
d obj;
obj.ef(obj.print);
我的派生类方法有问题,我将d::print()
作为b::ef()
的参数执行,编译时出现此错误:
"错误:无法将 '' 转换为 '无效(*)()'"
你能帮我解决它吗?谢谢
【问题讨论】:
您可以将成员函数指向为&d::print
。但是成员函数有一个隐藏参数:一个指向对象的指针。所以函数指针签名不匹配。
指向非成员函数的指针与指向成员函数的指针不兼容。区别在于指针非成员函数可以在没有对象的情况下调用,但指向成员函数的指针需要一个对象。并且传递obj.print
并not 仅传递对象的函数(您确实需要使用地址运算符&
来实现)。我建议您查看模板或std::function
和lambdas。
【参考方案1】:
这是您的代码,已修复。但我可以看到它有很多“错误”的地方,即“按照您的要求做,但不是您(可能)想要的。”
print
方法需要作用于d
对象。但这意味着基类必须知道派生类。尴尬了。如果基类有一个virtual print
函数,那么它可以传入该函数,并调用该虚函数的派生类覆盖。但这不是我们这里所拥有的。
#include <iostream>
using std::cout;
namespace
class d;
class b
public:
b();
void ef(d&, void(d::*)());
;
class d : public b
public:
d();
void print();
;
b::b()
void b::ef(d& dobj, void(d::*f)())
(dobj.*f)();
d::d() : b()
void d::print()
cout << "WORKS\n";
// anon
int main()
d obj;
obj.ef(obj, &d::print);
【讨论】:
以上是关于错误:无法将“<未解析的重载函数类型>”转换为“函数指针”的主要内容,如果未能解决你的问题,请参考以下文章
无法启动 WebDriverAgent:无法将命令代理到远程服务器。原始错误:错误:连接 ECONNREFUSED 127.0.0.1:8100