首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:“无法访问类‘boost::signals2::scoped_connection’中声明的私有成员”?

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

Stack Overflow用户
提问于 2012-05-04 01:48:42
回答 1查看 2.3K关注 0票数 3
代码语言:javascript
复制
class Whatever
{
public:
    virtual ~Whatever();

protected:
    Whatever();
    virtual void SomeMethod();
    void OnEventOccurred(int x);

    std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
}

// .cpp

代码语言:javascript
复制
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_;的成员声明中引起的

代码语言:javascript
复制
...\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不会。但是,我只需遍历集合并手动断开每个集合的连接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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>>.:

  • C++03: Use boost::ptr_vector,它将为您存储指针(允许不可复制的类型),但提供值语义,并消除上述对象的生存期和异常安全问题。

话虽如此,如果你不想让你的对象在词汇上限定作用域,为什么还要使用scoped_connection呢?

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10441652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档