2015-12-15 3 views
0

В настоящее время я работаю над приложением 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, и я работал нормально, прежде чем попытался объединить систему.

Любые предложения?

ответ

0

Вот причина сбоя:

TrialLogic Ваш класс имеет элемент типа boost.signal в нем, и этот тип не копируемого (наследуется от signal_base, который наследуется от nocopyable). Это делает класс TrialLogic сам не копируемый. Тем не менее, вы пытаетесь скопировать его здесь:

TrialLogic logic; 
boost::thread t(logic); 

Boost.thread принимает аргумент по значению, так что вы пытаетесь скопировать то, что не является копируемыми и компилятор расстроен.

Что касается решения, проще всего сделать следующее: вместо определения operator() на вашем TrialLogic определите функцию, чем передайте эту функцию, а также указатель или ссылку на логический класс. Нечто подобное:

class TrialLogic 
{ 
... 
void launch() { 
    boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
    testNum++; 
    emitSignal(); 
} 
}; 
... 
// in main 
boost::thread(&TrialLogic::launch, &logic); 

Последнее, но не менее, я не советую об использовании наддува :: нить. Поддержка потоков C++ 11 полностью работоспособна, а boost :: thread на самом деле не добавляет никаких преимуществ.

+0

Wow - это объясняет многое! Однако, если я не могу его скопировать, есть ли способ запустить поток без его обновления? –

+0

@RainerKeerdo, я дал одно предложение. – SergeyA

+0

Извините, должно быть, отправил его, когда писал комментарий!Но да, я попытаюсь использовать std :: thread then - я всегда использовал boost-потоки в своих предыдущих проектах. –

Смежные вопросы