0

编译器: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被认为是 const。

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

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

谁能给我一个线索?最好是允许我定义 FAIL1 和 FAIL2 并获得成功编译的线索。

4

1 回答 1

2

既不mutex是也不condition_variable是可复制的,所以你的SigUser是不可复制的,所以你不能把它传递给doConnect这种方式。解决此问题的一种方法是将sync和定义evSig为(智能)指针。

于 2012-08-25T09:17:08.937 回答