错误:“无法访问类'boost :: signals2 :: scoped_connection'中声明的私有成员?”

时间:2012-05-04 01:48:43

标签: c++ boost boost-signals noncopyable boost-signals2

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并非如此。但是,我可以遍历集合并手动断开每个集合。

1 个答案:

答案 0 :(得分:8)

boost::signals2::scoped_connection是不可复制的,在C ++ 03中,std::vector<T>要求T都是可复制构造和可复制分配的(此要求在C ++中放宽) 11,其中不可复制的类型是正常的,只要它是可移动的。)

天真的解决方案是将boostSignalConnections_改为std::vector<scoped_connection*>,但这会引入不值得付出努力的对象生命周期和异常安全问题。相反,根据您的编译器的最新程度,我建议如下:

  • C ++ 03:使用boost::ptr_vector<scoped_connection>,它将为您存储指针(允许不可复制的类型),但为您提供值语义,并消除上述对象生命周期和异常安全问题。
  • C ++ 11:以上仍然是一个有效的选项,但更惯用的方法是使用std::vector<std::unique_ptr<scoped_connection>>

话虽如此,如果你不希望你的对象有词汇范围,为什么要使用scoped_connection