关于c ++:如果slot对象包含互斥和条件变量,则Boost signals2 connect()调用无法编译

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

编译器:MSVS 2008

提升:1.49

码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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被认为是const。

如果我定义FAIL2(没有定义FAIL1),则在指定的行发生编译器错误:
错误C2248:'boost :: mutex :: mutex':无法访问类'boost :: mutex'中声明的私有成员

我不知道私人会员正在尝试访问什么。

任何人都可以给我一个线索吗? 最好是一条线索,允许我定义FAIL1和FAIL2并获得成功的编译。


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