2012-05-04 4 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))); 
    ... 
} 

(boost::signals2::connect()-AddEventOccurredObserver 위양을 기록하고 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

문제는 복사 생성자가 비공개라는 것이 맞습니다. 'vector'는 (예를 들어 확장 때문에) 재 할당의 경우 요소를 복사해야하기 때문에 이것은 문제입니다. 나는 당신을 위해 최선의 해결책을 가지고 있지 못하다. 그래서 나는 그것을 "다른 무엇을해야 하는가?"라는 함축적 인 질문에 실제로 대답하기 위해 남겨 둘 것이다. 나의 첫 번째, 순진한 응답은 힙 할당 된 연결에 대한 포인터/참조 벡터를 유지하는 것이지만 분명히 방정식의 '범위'부분의 유용성을 거의 제거합니다. – 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

@ 사용자 : 오른쪽, 연관 컨테이너 값은 시퀀스 컨테이너 값 및 연관 컨테이너 키보다 약한 요구 사항을가집니다. – ildjarn

관련 문제