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问题: Handle connection/disconnection of many signals/slots with boost::signals2
更新
仅供参考,当我从scoped_connection
更改为connection
时,它可以正常运行:std::vector<boost::signals2::connection> boostSignalConnections_;
。我使用scoped_connection
的全部原因是它们会在销毁时自动断开连接,而我相信connection
并非如此。但是,我可以遍历集合并手动断开每个集合。
答案 0 :(得分:8)
boost::signals2::scoped_connection
是不可复制的,在C ++ 03中,std::vector<T>
要求T
都是可复制构造和可复制分配的(此要求在C ++中放宽) 11,其中不可复制的类型是正常的,只要它是可移动的。)
天真的解决方案是将boostSignalConnections_
改为std::vector<scoped_connection*>
,但这会引入不值得付出努力的对象生命周期和异常安全问题。相反,根据您的编译器的最新程度,我建议如下:
boost::ptr_vector<scoped_connection>
,它将为您存储指针(允许不可复制的类型),但为您提供值语义,并消除上述对象生命周期和异常安全问题。std::vector<std::unique_ptr<scoped_connection>>
。话虽如此,如果你不希望你的对象有词汇范围,为什么要使用scoped_connection
?