【发布时间】:2012-05-13 13:47:13
【问题描述】:
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 不会。但是,我可以遍历集合并手动断开每个集合。
【问题讨论】:
-
你说得对,问题在于复制构造函数是私有的。由于
vector需要在重新分配的情况下复制元素(例如由于扩展),所以这是一个问题。不过,我没有最适合您的解决方案,所以我将把它留给其他人来实际回答“我应该怎么做?”这个隐含的问题。我的第一个天真的反应是保留一个指向堆分配连接的指针/引用向量,但这显然几乎消除了等式中scoped部分的用处。
标签: c++ boost boost-signals noncopyable boost-signals2