3
class Whatever
{
public:
    virtual ~Whatever();

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

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

// .cpp

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

AddEventOccurredObserver(に委任しboost::signals2::connect()て返すことに注意してください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 がコピーできないことに関係していると思いますか? わからない。私が scoped_connection を使用している理由は、この SO の質問のためです: 多くの信号/スロットの接続/切断を boost:: signals2 で処理する

アップデート

参考までに、 から に変更scoped_connectionするconnectionと動作します: std::vector<boost::signals2::connection> boostSignalConnections_;. 使用する私の全体的な理由scoped_connectionは、それらが破壊時に自動的に接続を切断することですが、私はそうでconnectionはないと信じています。ただし、コレクションを繰り返し処理して、それぞれを手動で切断することはできます。

4

1 に答える 1

8

boost::signals2::scoped_connectionはコピー不可であり、C++03 では、コピー構築可能かつコピー代入可能であるstd::vector<T>必要がTあります (この要件は C++11 では緩和され、代わりに移動可能である限り、コピー不可の型は問題ありません)。

単純な解決策は、代わりにboostSignalConnections_aを作成することですが、これにより、努力する価値のないオブジェクトの有効期間と例外の安全性の問題が発生します。std::vector<scoped_connection*>代わりに、コンパイラがどれだけ新しいかにもよりますが、次のことをお勧めします。

  • C++03: を使用しますboost::ptr_vector<scoped_connection>。これは、ポインターを格納します (コピー不可の型を許可します) が、値のセマンティクスを提供し、前述のオブジェクトの有効期間と例外の安全性の問題を排除します。
  • C++11: 上記は依然として有効なオプションですが、より慣用的なアプローチは を使用することstd::vector<std::unique_ptr<scoped_connection>>です。

scoped_connectionそうは言っても、オブジェクトをレキシカルスコープにしたくないのに、なぜ使用するのでしょうか?

于 2012-05-04T02:18:51.973 に答える