Boost signals2 给出不可复制的错误
Boost signals2 giving noncopyable errors
我目前正在开发一个 C++ 应用程序,我需要在其中创建一个向另一个模块发送升压信号的模块 class。我正在使用文档视图示例作为我的应用程序 (http://www.boost.org/doc/libs/1_55_0/doc/html/signals2/tutorial.html#signals2.tutorial.document-view) 的基础,但我不断收到错误消息:
Error 1 error C2280: boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable &)' : attempting to reference a deleted function
这让我完全难住了 - 错误实际上发生在哪里?
构建日志如下:
1>------ Build started: Project: 32BitTrial, Configuration: Debug Win32 ------
1> InboundLogicAdaptor.cpp
1> main.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocmon(232): error C2280: 'boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable &)' : attempting to reference a deleted function
1> C:\boost_1_58_0\boost/core/noncopyable.hpp(34) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable'
1> This diagnostic occurred in the compiler generated function 'boost::signals2::signal_base::signal_base(const boost::signals2::signal_base &)'
1> OutboundLogicAdaptor.cpp
1> TrialLogic.cpp
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我的主要功能相当简单 - 我构建了一个 GUI、一个与 GUI 通信的模型 (TrialModel)、一个每 500 毫秒计数 +1 的简单逻辑和一个出站逻辑适配器,可通过 boost signals2 库访问来自逻辑。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TrialModel m;
Trial w(0, &m);
w.show();
TrialLogic logic;
OutboundLogicAdaptor adaptor(&m, logic);
boost::thread t(logic);
a.exec();
t.join();
return 1;
}
逻辑 class 定义了一个信号,该信号具有一个参数(整数)和一个用作线程的 operator()。
TrialLogic.h :
#pragma once
#include <boost\thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost\signals2.hpp>
class TrialLogic
{
public:
typedef boost::signals2::signal<void(int x)> signal_t;
void operator()();
TrialLogic();
~TrialLogic();
boost::signals2::connection connect(const signal_t::slot_type &subscriber);
void doubleIncrementSlot();
private:
void emitSignal();
signal_t signal;
int testNum;
};
和代码本身:
#include "TrialLogic.h"
TrialLogic::TrialLogic()
{
testNum = 0;
}
TrialLogic::~TrialLogic()
{
}
boost::signals2::connection TrialLogic::connect(const signal_t::slot_type &subscriber){
return signal.connect(subscriber);
}
void TrialLogic::operator()(){
boost::this_thread::sleep(boost::posix_time::milliseconds(500));
testNum++;
emitSignal();
}
void TrialLogic::emitSignal(){
signal_t(testNum);
}
最后,接收信号的适配器 -
#include "OutboundLogicAdaptor.h"
OutboundLogicAdaptor::OutboundLogicAdaptor(TrialModel *modelHook, TrialLogic &logicHook) : logic(logicHook)
{
this->hook = modelHook;
signalConnection = logic.connect(boost::bind(&OutboundLogicAdaptor::transmitAngle, this, _1));
}
OutboundLogicAdaptor::~OutboundLogicAdaptor()
{
signalConnection.disconnect();
}
void OutboundLogicAdaptor::transmitAngle(int angle){
hook->postAngle(angle);
}
从我的第一次检查开始,我没有发现我做错了什么,但显然我的代码存在严重错误。我很确定问题也不在 GUI 方面,因为我实际上并没有在那里使用任何增强功能,而且在我尝试将系统绑定在一起之前它工作正常。
有什么建议吗?
失败原因如下:
你的TrialLogic
class里面有一个boost.signal
类型的成员,这个类型是不可复制的(继承自signal_base
,继承自signal_base
nocopyable
)。这使得 class TrialLogic
本身不可复制。然而你却试图将它复制到这里:
TrialLogic logic;
boost::thread t(logic);
Boost.thread
按值接受参数,所以你试图复制一些不可复制的东西,编译器不高兴。
至于解决方案,最简单的似乎如下:与其在 TrialLogic
上定义 operator()
,不如定义一个函数,而不是传递该函数以及指向逻辑 class。类似的东西:
class TrialLogic
{
...
void launch() {
boost::this_thread::sleep(boost::posix_time::milliseconds(500));
testNum++;
emitSignal();
}
};
...
// in main
boost::thread(&TrialLogic::launch, &logic);
最后但同样重要的是,我不建议使用 boost::thread。 C++11 线程支持完全可用,boost::thread 并没有真正增加任何好处。
我目前正在开发一个 C++ 应用程序,我需要在其中创建一个向另一个模块发送升压信号的模块 class。我正在使用文档视图示例作为我的应用程序 (http://www.boost.org/doc/libs/1_55_0/doc/html/signals2/tutorial.html#signals2.tutorial.document-view) 的基础,但我不断收到错误消息:
Error 1 error C2280: boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable &)' : attempting to reference a deleted function
这让我完全难住了 - 错误实际上发生在哪里?
构建日志如下:
1>------ Build started: Project: 32BitTrial, Configuration: Debug Win32 ------
1> InboundLogicAdaptor.cpp
1> main.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocmon(232): error C2280: 'boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable &)' : attempting to reference a deleted function
1> C:\boost_1_58_0\boost/core/noncopyable.hpp(34) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable'
1> This diagnostic occurred in the compiler generated function 'boost::signals2::signal_base::signal_base(const boost::signals2::signal_base &)'
1> OutboundLogicAdaptor.cpp
1> TrialLogic.cpp
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我的主要功能相当简单 - 我构建了一个 GUI、一个与 GUI 通信的模型 (TrialModel)、一个每 500 毫秒计数 +1 的简单逻辑和一个出站逻辑适配器,可通过 boost signals2 库访问来自逻辑。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TrialModel m;
Trial w(0, &m);
w.show();
TrialLogic logic;
OutboundLogicAdaptor adaptor(&m, logic);
boost::thread t(logic);
a.exec();
t.join();
return 1;
}
逻辑 class 定义了一个信号,该信号具有一个参数(整数)和一个用作线程的 operator()。
TrialLogic.h :
#pragma once
#include <boost\thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost\signals2.hpp>
class TrialLogic
{
public:
typedef boost::signals2::signal<void(int x)> signal_t;
void operator()();
TrialLogic();
~TrialLogic();
boost::signals2::connection connect(const signal_t::slot_type &subscriber);
void doubleIncrementSlot();
private:
void emitSignal();
signal_t signal;
int testNum;
};
和代码本身:
#include "TrialLogic.h"
TrialLogic::TrialLogic()
{
testNum = 0;
}
TrialLogic::~TrialLogic()
{
}
boost::signals2::connection TrialLogic::connect(const signal_t::slot_type &subscriber){
return signal.connect(subscriber);
}
void TrialLogic::operator()(){
boost::this_thread::sleep(boost::posix_time::milliseconds(500));
testNum++;
emitSignal();
}
void TrialLogic::emitSignal(){
signal_t(testNum);
}
最后,接收信号的适配器 -
#include "OutboundLogicAdaptor.h"
OutboundLogicAdaptor::OutboundLogicAdaptor(TrialModel *modelHook, TrialLogic &logicHook) : logic(logicHook)
{
this->hook = modelHook;
signalConnection = logic.connect(boost::bind(&OutboundLogicAdaptor::transmitAngle, this, _1));
}
OutboundLogicAdaptor::~OutboundLogicAdaptor()
{
signalConnection.disconnect();
}
void OutboundLogicAdaptor::transmitAngle(int angle){
hook->postAngle(angle);
}
从我的第一次检查开始,我没有发现我做错了什么,但显然我的代码存在严重错误。我很确定问题也不在 GUI 方面,因为我实际上并没有在那里使用任何增强功能,而且在我尝试将系统绑定在一起之前它工作正常。
有什么建议吗?
失败原因如下:
你的TrialLogic
class里面有一个boost.signal
类型的成员,这个类型是不可复制的(继承自signal_base
,继承自signal_base
nocopyable
)。这使得 class TrialLogic
本身不可复制。然而你却试图将它复制到这里:
TrialLogic logic;
boost::thread t(logic);
Boost.thread
按值接受参数,所以你试图复制一些不可复制的东西,编译器不高兴。
至于解决方案,最简单的似乎如下:与其在 TrialLogic
上定义 operator()
,不如定义一个函数,而不是传递该函数以及指向逻辑 class。类似的东西:
class TrialLogic
{
...
void launch() {
boost::this_thread::sleep(boost::posix_time::milliseconds(500));
testNum++;
emitSignal();
}
};
...
// in main
boost::thread(&TrialLogic::launch, &logic);
最后但同样重要的是,我不建议使用 boost::thread。 C++11 线程支持完全可用,boost::thread 并没有真正增加任何好处。