2012-05-04 44 views
3
class Whatever 
{ 
public: 
    virtual ~Whatever(); 

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

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

//的.cpp錯誤:「無法訪問在類'boost :: signals2 :: scoped_connection'中聲明的私有成員」?

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

更新

僅供參考,當我從scoped_connectionconnection它的工作原理改變:std::vector<boost::signals2::connection> boostSignalConnections_;。我使用scoped_connection的全部理由是,它們會自動斷開破壞連接,但我相信connection不會。但是,我可以遍歷集合並手動斷開每個集合。

+0

你是對的,問題是複製構造函數是私人的。由於'vector'需要在重新分配的情況下複製元素(例如由於擴展),所以這是一個問題。儘管我沒有最好的解決方案,所以我會把它留給其他人來回答隱含的問題:「我該怎麼做?」我的第一個天真的迴應是保持指向堆分配連接的指針/引用向量,但這顯然幾乎消除了等式的scoped部分的用處。 – tmpearce

回答

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如果你不希望你的對象是詞法範圍?

+0

好問題,但正如我所提到的,我是在我的問題中鏈接到的問題中的示例(雖然它使用的地圖,所以也許它是不同的?)我在容器中使用範圍對象似乎不尋常,但我不是那些熟悉它們的人。 – User

+0

@User:對,關聯容器值比序列容器值和關聯容器鍵的要求更弱。 – ildjarn

相關問題