如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败

Boost signals2 connect() call fails to compile if slot object contains mutex & condition variable

本文关键字:connect signals2 Boost 失败 编译 调用 包含互 对象 插槽 变量 条件      更新时间:2023-10-16

编译器:MSVS 2008

提升:1.49

代码:

#include <boost/signals2.hpp>
#include <boost/thread.hpp>
class SigOwner
{
public:
    typedef boost::signals2::signal<void (int)> OSig;
    OSig _signal;
    void doConnect(OSig::slot_type slot) { _signal.connect(slot); }
};
class SigUser
{
public:
#if defined(FAIL2)
    boost::mutex sync;
#endif
#if defined(FAIL1)
    boost::condition_variable evSig;
#endif
    void setup(SigOwner &so)
    {
        so.doConnect(*this);   // failure 1 traces back to this line
    }
    void operator()(int value) // signature to make SigUser a slot
    {
    }
};                             // failure 2 flags on this line

如前所述,这编译正常。

如果我定义FAIL1(带或不带FAIL2),则signals2/slot_template.hpp中会出现编译器错误:错误C2679:二进制"=":找不到接受"const SigUser"类型的右侧操作数的运算符(或者没有可接受的转换)

我不知道为什么*this被认为是常量。

如果我定义FAIL2(未定义FAIL1),则编译器错误出现在指示行:错误C2248:"boost::mutex::mutex":无法访问在类"boost::互斥"中声明的私有成员

我不知道是哪个私人成员试图被访问。

有人能给我提供线索吗?最好是一条线索,让我可以定义FAIL1和FAIL2,并获得成功的编译。

mutexcondition_variable都不可复制,因此您的SigUser不可复制的,因此无法通过这种方式将其传递给doConnect。解决此问题的一种方法是将syncevSig定义为(智能)指针。