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
этого не делает. Однако я могу просто перебирать коллекцию и вручную отключать каждую из них.
vector
необходимо копировать элементы в случае перераспределения (например, из-за расширения), это проблема. Однако у меня нет лучшего решения для вас, поэтому я оставлю это другим, чтобы фактически ответить на неявный вопрос, что мне делать вместо этого? Мой первый, наивный ответ состоял бы в том, чтобы сохранить вектор указателей/ссылок на соединения, выделенные в куче, но это, очевидно, в значительной степени устраняет полезность частиscoped
уравнения. - person tmpearce   schedule 04.05.2012