2012-05-04 15 views
3
class Whatever 
{ 
public: 
    virtual ~Whatever(); 

protected: 
    Whatever(); 
    virtual void SomeMethod(); 
    void OnEventOccurred(int x); 

    std::vector<boost::signals2::scoped_connection> boostSignalConnections_; 
} 

// .cppファイルエラー: "クラス 'boost :: signals2 :: scoped_connection'で宣言されたプライベートメンバーにアクセスできません"

Whatever::SomeMethod() 
{ 
    ... 
    boostSignalConnections_.push_back(
     anObject->AddEventOccurredObserver(
      std::bind(&Whatever::OnEventOccurred, 
         this, std::placeholders::_1))); 
    ... 
} 

boost::signals2::connect()AddEventOccurredObserverちょうどデリゲートを注意してboost::signals2::connectionを返す)

私は次のエラーを取得しています。これは、テンプレートのエラーを解釈するのは困難ですが、エラーは、私が検索したstd::vector<boost::signals2::scoped_connection> boostSignalConnections_;

...\vc\include\xmemory(202): error C2248: 
    'boost::signals2::scoped_connection::scoped_connection' : 
    cannot access private member declared in class 'boost::signals2::scoped_connection' 
...\boost_1_47\boost\signals2\connection.hpp(234) : see declaration of 
'boost::signals2::scoped_connection::scoped_connection' 
...\boost_1_47\boost\signals2\connection.hpp(210) : 
    see declaration of 'boost::signals2::scoped_connection' 
...\vc\include\xmemory(201) : while compiling class template member function 
'void std::allocator<_Ty>::construct(boost::signals2::scoped_connection *,_Ty &&)' 
with 
[ 
    _Ty=boost::signals2::scoped_connection 
] 

のメンバ宣言で引き起こされているように思えるし、私はそれがscoped_connectionがコピー可能でないとしなければならないかもしれないと思いますか?よく分かりません。 Handle connection/disconnection of many signals/slots with boost::signals2

更新

ちなみに、私はscoped_connectionからconnectionに変更した場合、それは動作します:std::vector<boost::signals2::connection> boostSignalConnections_;を私はscoped_connectionを使用している理由は、このSO疑問です。 scoped_connectionを使用している私の主な理由は、彼らが自動的に切断時に接続を切断するということです。私はconnectionがそうでないと信じています。しかし、私はコレクションを繰り返して、手動でそれぞれを切断することができます。

+0

問題は、コピーコンストラクタがプライベートであるということは間違いありません。 'ベクトル 'は(例えば拡張のために)再割り当ての場合に要素をコピーする必要があるので、これは問題です。私はあなたのために最善の解決策を持っていないので、私は実際に "代わりに何をすべきか"という暗黙の質問に答えるために他の人に任せます。私の最初の、素朴な応答は、ヒープ割り当てされた接続へのポインタ/参照のベクトルを保持することですが、明らかに、式のスコープ部分の有用性はほとんどありません。 – tmpearce

答えて

8

boost::signals2::scoped_connectionは、非コピー可能であり、そしてC++ 03で、std::vector<T>Tが(コピー構築可能とコピー割り当て可能の両方である。この要件は、非コピー可能タイプとして微細でC++ 11に緩和されることを必要としますそれが代わりに動くように長い間)。

代わりに、boostSignalConnections_std::vector<scoped_connection*>とすることができますが、これにより、オブジェクトの寿命と例外的な安全性の問題が発生します。

  • C++ 03:代わりに、どのように最近のコンパイラに依存し、私は次のことをお勧めしたいあなたのためのポインタを格納します使用boost::ptr_vector<scoped_connection>、(非コピー可能なタイプを許可する)が、あなたの価値の意味を与えます前述のオブジェクトの存続期間および例外安全性の問題を排除します。
  • C++ 11:上記はまだ有効ですが、より慣用的なアプローチはstd::vector<std::unique_ptr<scoped_connection>>を使用することです。

言い換えれば、オブジェクトをレキシカルスコープにしたくない場合、なぜscoped_connectionを使用するのですか?

+0

良い質問ですが、私は私の質問にリンクされている質問の例に従っていましたが(地図では多分違っていますが)コンテナ内のスコープ付きオブジェクトを使用するのは珍しいようでしたが、それをよく知っている人。 – User

+0

@ユーザー:右の連想コンテナーの値は、シーケンスコンテナーの値と連想コンテナーのキーよりも弱いです。 – ildjarn

関連する問題