C++将成员函数指针保存到类变量时出现编译错误求助
嘿,这个编译错误的根源很明确——函数签名不匹配!让我给你拆解一下问题出在哪,以及怎么修复:
问题分析
你定义的framePayloadWriter是std::function<void(NG_BLK_BUFFER*)>类型,这意味着它只能接受一个参数为NG_BLK_BUFFER*、返回值为void的可调用对象。
但你绑定的PcapNgFile::writeEPB是无参函数(void writeEPB();),而且你在std::bind里还额外加了std::placeholders::_1——这就导致bind生成的绑定器期望被调用时传入一个参数,可实际writeEPB根本不接受任何参数,两者的类型完全不兼容,编译器自然找不到合适的赋值运算符,抛出C2679错误。
修复方案
有两种常见的解决思路,你可以根据实际需求选择:
方案1:让writeEPB匹配framePayloadWriter的参数要求
如果writeEPB确实需要用到NG_BLK_BUFFER*参数,直接修改函数签名,让它接收这个参数:
首先更新类声明:
class PcapNgFile : public std::ofstream { public: // ... void writeEPB(NG_BLK_BUFFER* buffer); // 新增参数 // ... };
然后实现函数:
void PcapNgFile::writeEPB(NG_BLK_BUFFER* buffer) { std::cout << "Writing an EPB" << std::endl; // 这里可以使用buffer进行相关逻辑处理 }
这时候原来的std::bind代码就可以正常工作了,因为绑定器的参数和函数的参数完全匹配。
方案2:用Lambda忽略不需要的参数
如果writeEPB根本不需要NG_BLK_BUFFER*参数,那可以用Lambda表达式来包裹调用,自动忽略掉这个多余的参数:
this->ringBuffer->framePayloadWriter = [this](NG_BLK_BUFFER*) { this->writeEPB(); };
Lambda的签名(接受NG_BLK_BUFFER*,返回void)完美匹配framePayloadWriter的类型,同时内部调用无参的writeEPB,既满足了类型要求,又实现了你的逻辑。
额外提示
相比std::bind,Lambda在这种场景下往往更直观、可读性更强,尤其是涉及到参数匹配或者捕获this的时候,Lambda的语法会更清晰。
内容的提问来源于stack exchange,提问作者Paul Offord

