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 と見なされる理由がわかりません。

( FAIL1を定義せずに) FAIL2 を定義すると、示された行でコンパイラ エラーが発生します: エラー C2248: 'boost::mutex::mutex' : cannot access private member defined in class 'boost::mutex'

どのプライベート メンバーにアクセスしようとしているのかわかりません。

誰でも私に手がかりを提供できますか?できれば、FAIL1 と FAIL2 の両方を定義し、コンパイルを成功させる手がかりが必要です。

4

1 に答える 1

2

どちらmutexcondition_variableコピー可能ではないため、あなたSigUserはコピー可能ではないため、この方法に渡すことはできませんdoConnect。これを回避する 1 つの方法は、syncandevSigを (スマート) ポインターとして定義することです。

于 2012-08-25T09:17:08.937 に答える