错误:无法将“<未解析的重载函数类型>”转换为“函数指针”

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() 的参数执行,编译时出现此错误:

"错误:无法将 '' 转换为 '无效(*)()'"

你能帮我解决它吗?谢谢

【问题讨论】:

您可以将成员函数指向为&amp;d::print。但是成员函数有一个隐藏参数:一个指向对象的指针。所以函数指针签名不匹配。 指向非成员函数的指针与指向成员函数的指针不兼容。区别在于指针非成员函数可以在没有对象的情况下调用,但指向成员函数的指针需要一个对象。并且传递obj.printnot 仅传递对象的函数(您确实需要使用地址运算符&amp; 来实现)。我建议您查看模板或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

“无法将 'float' 转换为 float**” 错误

Android 房间持久库 - TypeConverter 错误错误:无法弄清楚如何将字段保存到数据库”

无法将第二个自引用 FK 添加到模型,导致无法确定主体结束错误