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的原因是因为这个问题:Handle connection/disconnection of many signals/slots with boost::signals2
更新
FYI,当我从scoped_connection转换为connection时,它是有效的:std::vector<boost::signals2::connection> boostSignalConnections_;。我使用scoped_connection的全部原因是,它们在破坏时会自动断开连接,而我相信connection不会。但是,我只需遍历集合并手动断开每个集合的连接。
发布于 2012-05-04 02:18:51
boost::signals2::scoped_connection是不可复制的,而在C++03中,std::vector<T>要求T既是可复制的,又是可复制的(这一要求在C++11中是放宽的,在C++11中,不可复制的类型只要可以移动就可以了)。
天真的解决方案是将boostSignalConnections_变成一个std::vector<scoped_connection*>,但这会引入对象生存期和异常安全问题,这些问题都不值得付出努力。相反,根据编译器最近的情况,我建议如下:
使用std::vector<std::unique_ptr<scoped_connection>>.:
boost::ptr_vector,它将为您存储指针(允许不可复制的类型),但提供值语义,并消除上述对象的生存期和异常安全问题。话虽如此,如果你不想让你的对象在词汇上限定作用域,为什么还要使用scoped_connection呢?
https://stackoverflow.com/questions/10441652
复制相似问题