如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
Boost signals2 connect() call fails to compile if slot object contains mutex & condition variable
编译器: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,并获得成功的编译。
mutex
和condition_variable
都不可复制,因此您的SigUser
不可复制的,因此无法通过这种方式将其传递给doConnect
。解决此问题的一种方法是将sync
和evSig
定义为(智能)指针。
相关文章:
- WinSock2:connect() 提供"连接被拒绝"
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- 在 QTextEdit 中使用指针或在 Qt-Creator 上使用 connect()
- gnuradio c++ connect self() throw bad_weak_ptr
- 如何将函数指针传递给方法,以便它可以在Qt的connect()中使用?
- 在CTOR vs Connect方法中提升套接字与stream_socket端点
- Make zmqpp::socket::connect a std::future
- C-Free and MySQL connect
- 当我使用Connect信号和插槽时,会出现此分解错误
- 为什么 connect() 函数看不到插槽?
- QT 库 QObject::connect: 无法连接 (null)::done() 到 MainWindow::upd
- QObject::connect 有太多的参数
- 可以在 QObject::connect() C++中连接 QML 对象现有信号?
- 使用QT Connect时,视觉工作室警告
- connect(QObject*, SIGNAL(signal()), functor) 在 qt5 中未连接
- SDL_Init失败并显示'SDL_Error: Failed to connect to the Mir Server'
- 如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
- Signals2 connect()与模板的用法
- 为什么 boost::signals2::signal:<T>:connect 需要复制构造函数?
- Boost::signals2::signal::connect 的原型是什么?