2

deque と boost::mutex に問題があります。以下のエラーでコンパイルされる簡単な例を作成しました。

問題は、プライベート メンバーとして 1 つ以上のミューテックスを持つクラスの両端キューが必要なことです。現在、この例ではエラーが発生していますが:

エラー C2248: 'boost::mutex::mutex': クラス 'boost::mutex' で宣言されたプライベート メンバーにアクセスできません

関連する投稿をいくつか見ましたが、これまでのところ、この特定の問題を解決できていません。

どんな助けでも大歓迎です...

#include <iostream>  
#include <boost/thread.hpp>  
#include <deque>  

using namespace std;

class object {
public:
    void process(void)
    {
        m_mutex.lock();
        // do something
        a = a*10;
        m_mutex.unlock();
    }
    object(int v){  a = v; }        
private:
    int a;
    boost::mutex m_mutex;
};

int main(int argc, char* argv[])  
{
    deque<object> obj; 

    obj.push_back( object( 1 ) );
    obj.push_back( object( 2 ) );
    obj.push_back( object( 3 ) );

    obj.at(0).process();
    obj.at(1).process();
    obj.at(2).process();

    return 0;  
};
4

4 に答える 4

4
obj.push_back( object( 1 ) );

上記の行はobject、deque 要素にコピー構築される一時的なインスタンスを作成します。はコピー構成可能ではないためboost::mutex、コンパイラは のコピー コンストラクターを合成できませんobject

それがコピー構築可能にする必要がある唯一の場所である場合はobject、ステートメントを次のように変更します

obj.emplace_back( 1 );

emplace_backobjectコピー構築を使用する代わりに、インスタンスがその場で構築されます。


C++11 機能にアクセスできない場合は、objectクラスを次のように変更します。

#include <memory>

class object {
public:
    void process(void)
    {
        m_mutex->lock();
        // do something
        a = a*10;
        m_mutex->unlock();
    }
    object(int v)
    : m_mutex( std::make_shared<boost::mutex>() )
    {  
      a = v; 
    }     

private:
    int a;
    std::shared_ptr<boost::mutex> m_mutex;
};

VS2008 では、代わりに使用する必要がある場合がありますstd::tr1::shared_ptr

于 2012-05-29T21:32:00.773 に答える
3

ミューテックスのコピーを避けるためにわざわざコピー コンストラクターを作成したくない場合は、代わりにBoostのPointer Containerを使用できます。

例えば:

#include <boost/ptr_container/ptr_deque.hpp>
...
boost::ptr_deque<object> obj;
obj.push_back(new object());
obj[0].process()
...

object現在、deque は通常の deque と同じように動作しますが、インスタンスをコピーしようとはしません。

于 2012-05-29T21:33:56.473 に答える
3

ミューテックスは CopyConstructible ではないため、型のコピー コンストラクターの形式が正しくありません。

ミューテックスをコピーしないユーザー定義のコピー コンストラクターを提供できます。

于 2012-05-29T21:09:14.703 に答える
2

ミューテックスをコピーすることはできないため、ミューテックスを含むクラスもコピーできません。unique_ptr別の方法として、クラスに s の両端キューを作成できます

 std::deque<std::unique_ptr<object>> obj;
于 2012-05-29T21:10:59.973 に答える