初始化C++结构体vector时触发构造函数错误求助
解决std::vector初始化时的构造函数匹配错误
我来帮你搞定这个构造函数不匹配的问题!你遇到的错误核心原因是非静态成员函数指针的初始化语法不对,再加上可能对C++列表初始化的细节没注意到,咱们一步步来修正:
问题根源
你的opcodeTableE结构体里的instruction是一个非静态成员函数指针,这种指针的初始化必须严格遵循C的语法规则:你不能直接写chipCpu::clearScreen,必须加上取地址符&,也就是&chipCpu::clearScreen——这是C对非静态成员函数指针的强制要求。
另外还要确认你的编译器是否开启了C11或更高版本的标准,因为列表初始化(就是用{}初始化vector)是C11才引入的特性。
修正后的完整代码示例
第一步:确保结构体和成员函数的访问权限(如果是类内部结构体)
如果opcodeTableE是chipCpu类的内部结构体,一定要把它设为public,否则外部无法访问:
#include <vector> #include <cstdint> class chipCpu { public: // 公开的结构体定义 struct opcodeTableE { uint16_t opcode; uint16_t mask; void (chipCpu::*instruction)(uint16_t); }; // 成员函数的实现(这里写个空示例) void clearScreen(uint16_t /* param */) { // 清屏逻辑 } void returnFromSub(uint16_t /* param */) { // 从子程序返回逻辑 } };
第二步:正确初始化vector
不管是在chipCpu的成员函数内部,还是外部,都要使用正确的成员函数指针语法:
// 外部初始化的写法 std::vector<chipCpu::opcodeTableE> opcodetable{ {0x00E0, 0xFFFF, &chipCpu::clearScreen}, {0x00EE, 0xFFFF, &chipCpu::returnFromSub} }; // 如果是在chipCpu成员函数内部初始化,可以简化为: std::vector<opcodeTableE> opcodetable{ {0x00E0, 0xFFFF, &chipCpu::clearScreen}, {0x00EE, 0xFFFF, &chipCpu::returnFromSub} };
兼容老编译器的备选方案
如果你的编译器版本较低,不支持C++11的列表初始化,可以改用push_back或者emplace_back来添加元素:
std::vector<chipCpu::opcodeTableE> opcodetable; // 使用push_back opcodetable.push_back(chipCpu::opcodeTableE{0x00E0, 0xFFFF, &chipCpu::clearScreen}); opcodetable.push_back(chipCpu::opcodeTableE{0x00EE, 0xFFFF, &chipCpu::returnFromSub}); // 或者更高效的emplace_back opcodetable.emplace_back(0x00E0, 0xFFFF, &chipCpu::clearScreen); opcodetable.emplace_back(0x00EE, 0xFFFF, &chipCpu::returnFromSub);
额外注意点
当你后续调用这个成员函数指针时,必须通过chipCpu的实例来调用,语法是:
chipCpu cpu; // 假设你从vector里拿到了一个opcodeTableE对象entry (cpu.*entry.instruction)(0x0000); // 传入对应的参数 // 如果是指针的话: chipCpu* cpu_ptr = &cpu; (cpu_ptr->*entry.instruction)(0x0000);
内容的提问来源于stack exchange,提问作者Knox Root
相关产品推荐
相关产品推荐

