В настоящее время я работаю над приложением C++, где мне нужно создать модуль, который посылает сигналы повышения в другой класс. Я использую пример Document-View в качестве основы для моего приложения (http://www.boost.org/doc/libs/1_55_0/doc/html/signals2/tutorial.html#signals2.tutorial.document-view), но я получаю сообщение об ошибке:Boost сигналы2, дающие неопубликованные ошибки
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), простой логики, которая рассчитывает +1 каждый 500msec и адаптер исходящей логики, доступ к которому осуществляется через библиотеку boost signal2 из Logic.
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;
}
Логический класс определяет сигнал, который имеет один аргумент (целое число) и оператор() для действующих как нить.
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, так как я фактически не использую там никаких функций boost, и я работал нормально, прежде чем попытался объединить систему.
Любые предложения?
Wow - это объясняет многое! Однако, если я не могу его скопировать, есть ли способ запустить поток без его обновления? –
@RainerKeerdo, я дал одно предложение. – SergeyA
Извините, должно быть, отправил его, когда писал комментарий!Но да, я попытаюсь использовать std :: thread then - я всегда использовал boost-потоки в своих предыдущих проектах. –