0

私は現在、ブースト信号を別のクラスに送信するモジュールを作成する必要がある C++ アプリケーションに取り組んでいます。アプリケーションの基礎として Document-View の例を使用しています ( 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 をカウントする単純なロジック、およびロジックからブースト信号 2 ライブラリを介してアクセスされるアウトバウンド ロジック アダプターを構築します。

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;

}

logic クラスは、1 つの引数 (整数) とスレッドとして機能する 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 側にも問題はないと確信しています。

助言がありますか?

4

1 に答える 1

0

失敗の理由は次のとおりです。

TrialLogicクラスに type のメンバーがあり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);

最後になりましたが、boost::thread の使用についてはお勧めしません。C++11 スレッドのサポートは完全に機能しており、boost::thread は実際には何のメリットもありません。

于 2015-12-15T22:18:28.397 に答える