C++ 调用成员函数指针时,指向与对象不兼容的成员类型的指针

C++ 调用成员函数指针时,指向与对象不兼容的成员类型的指针,c++,pointers,function-pointers,member-function-pointers,member-functions,C++,Pointers,Function Pointers,Member Function Pointers,Member Functions,问题 我有一个在运行时分配的成员函数指针数组。我在尝试调用它们时遇到编译时错误: 指向成员类型“void(YCPU:)(uint16_t){aka”void(YCPU:)(短无符号int)}的指针与对象类型“YCPU指令”不兼容` 我很难理解调用指针的正确语法 代码和问题详细信息 我有一个存储两个成员函数指针的structycpu指令。这些函数指针指向YCPU中的成员函数。我存储一个ycpu指令数组,在初始化过程中调用initialize,它将这些指针分配给正确的成员函数 成员函数指针和指令:

问题

我有一个在运行时分配的成员函数指针数组。我在尝试调用它们时遇到编译时错误:

指向成员类型“void(YCPU:)(uint16_t){aka”void(YCPU:)(短无符号int)}的指针与对象类型“YCPU指令”不兼容`

我很难理解调用指针的正确语法

代码和问题详细信息

我有一个存储两个成员函数指针的struct
ycpu指令
。这些函数指针指向
YCPU
中的成员函数。我存储一个
ycpu指令数组
,在初始化过程中调用initialize,它将这些指针分配给正确的成员函数

成员函数指针和指令:

typedef void(YCPU::*YCPU操作码)(uint16_t操作码);
typedef std::string(YCPU::*YCPUDisassembler)(std::string name,uint16_t操作数,uint16_t nextword,uint16_t地址,
bool显示内存内容、uint16和指令大小);
结构指令{
std::字符串名;
静态YCPU操作码;
静态拆装器;
整数圈;
布尔是_nop;
void initialize(std::string name,YCPUOpcode操作码,YCPUDisassembler反汇编程序,int cycles,bool is_NOP=false)
{
此->名称=名称;
此->操作码=操作码;
此->反汇编程序=反汇编程序;
这->周期=周期;
这->is\u nop=is\u nop;
}
};
YCPU

YCPU类
{
公众:
//YCPUOpcode指向其中一个函数(比这3个函数多得多,只是示例)
无效NOP(uint16操作码);
无效ADC(uint16操作码);
无效添加(uint16操作码);
...
//YCPUDisassembler指向其中一个函数(比这两个函数多得多,只是示例)
std::string反汇编逻辑单元(std::string name,uint16\u t操作数,uint16\u t nextword,uint16\u t地址,
bool显示内存内容、uint16和指令大小);
std::string反汇编(std::string name,uint16\u t操作数,uint16\u t nextword,uint16\u t地址,
bool显示内存内容、uint16和指令大小);
...
私人:
阵列操作码;
};
在设置过程中,我初始化操作码,如下所示:

void YCPU::run_one_instruction()
{
    ...
    uint16_t word = read_mem_int16(PC, SI_CS); // 0x1-0xff
    YCPUInstruction op = opcodes[word & 0xFFFF];
    (op.*YCPUInstruction::opcode)(word);
    ...
}
void YCPU::初始化操作码()
{
操作码[0x01]。初始化(“CMP”、&YCPU::CMP、&YCPU::反汇编运算单元,0);
操作码[0x02]。初始化(“CMP”、&YCPU::CMP、&YCPU::反汇编运算单元,0);
操作码[0x03]。初始化(“CMP”、&YCPU::CMP、&YCPU::反汇编运算单元,0);
…//对于所有指令,依此类推
}
初始化后,我尝试调用成员函数,如下所示:

void YCPU::run_one_instruction()
{
    ...
    uint16_t word = read_mem_int16(PC, SI_CS); // 0x1-0xff
    YCPUInstruction op = opcodes[word & 0xFFFF];
    (op.*YCPUInstruction::opcode)(word);
    ...
}
但是,这会抛出我上面提到的编译器错误

如果我先取消引用
op
,如下所示:

(op->*ycpu指令::操作码)(word);
我得到这个错误:

错误:“运算符->*”不匹配(操作数类型为“YCPU指令”和“YCPU操作码”{aka'void(YCPU::*)(短无符号整数)})

如果我将语法更改为:

(op->*操作码)(word);
或:

(op.*opcode)(word)
我得到这个错误

错误:“操作码”未在此作用域中声明


调用这些成员函数指针需要使用什么特定语法?

的左操作数*必须引用/的左操作数->*必须指向成员函数包含类的对象。右操作数可以是指向成员值的指针的任何表达式

您正在使用的成员函数的包含类是
YCPU
,因此将
YCPU指令作为左操作数是不正确的。我看到您的表达式位于
YCPU
的另一个成员函数中,因此假设您希望在调用
YCPU
函数时使用
*this
,则需要
this->*
。下面的表达式可以是普通的
->
表达式,只从
ycpu指令
获取而不是调用指向成员函数值的指针。由于
*
->*
的优先级很奇怪,因此经常需要并建议使用过多的括号

void YCPU::run_one_instruction()
{
    // ...
    uint16_t word = read_mem_int16(PC, SI_CS); // 0x1-0xff
    YCPUInstruction op = opcodes[word & 0xFFFF];
    (this->*(op.opcode))(word);
    // ...
}

根据您的错误消息,听起来好像您试图使用
ycpu指令
而不是
YCPUOpcode
。什么类型是
op
?op是一条指令。抱歉,我将更新代码以显示其类型以及如何分配这些类型描述属于
YCPU
成员的函数。那么,您希望
this
指向这些函数内部的
YCPU
对象是什么呢?您已经将
opcode
定义为
static
,但试图将其视为成员变量。这是什么意思?@KenWayneVanderLinde你能给我联系一些关于差异的信息吗?我只是在听IDE,忘了添加了那个标识符。YCPU是存储op并在“函数指针的包含类是
YCPU
”中调用它的父对象。我想您是指“成员函数”的类吧?指向成员的指针实际上是
YCPU指令的数据成员,指向
YCPU
的函数成员。