2012-02-09 3 views
0

크로스 플랫폼보기로 Windows 코드를 다시 작성해야합니다. 다음은 예입니다 코드표준에서 unordered_set

std::unordered_set<Type>::iterator it = ...; 
it._Ptr->_Myval->... 

Everywere가 반복자에 _Ptr 회원이하지만 문서에서 찾을 수 없습니다. Visual Studio (stl의 구현)와 함께 작동한다고 생각합니다. 어떤 아이디어가 그것을 대체하는 방법? 그리고 _Myval은 무엇입니까?


UPD :

for(std::unordered_set<QuadTreeOccupant*>::iterator it = ...) 
    it->aabb; 

class QuadTreeOccupant 
{ 
    public: 
     AABB aabb; 
}; 

그리고 라인 it->aabb에서 오류 : VC의 구현에 특정 unordered_map

error: request for member ‘aabb’ in ‘* it.std::__detail::_Hashtable_iterator<_Value, __constant_iterators, __cache>::operator-> with _Value = qdt::QuadTreeOccupant*, bool __constant_iterators = true, bool _cache = false, std::_detail::_Hashtable_iterator<_Value, __constant_iterators, __cache>::pointer = qdt::QuadTreeOccupant* const*’, which is of non-class type ‘qdt::QuadTreeOccupant* const’

답변

4

사람들이 구현 세부 사항. 당신은 _Ptr_Myval에 대한 참조를 제거하고 중 하나를 사용해야합니다 it._Ptr->_Myval.

+0

이 업데이트를 볼 수 있습니다, 제발? – Ockonal

+4

@Ockonal :'(* it) -> aabb','hash_map'에 * 포인터 *가 포함되어 있으므로 역 참조도 필요합니다. – Xeo

0

대신에

  • it->
  • (*it).

_Ptr는 구현 상세처럼 보이는 어떤 당신이 shouldn 액세스 할 수 없습니다 (즉, private이어야합니다). 어떤 경우에도 사용하면 안됩니다. 밑줄로 시작하고 ca pital letter는 명시 적으로 초대 된 사람들을 제외한 모든 사람들이 사용할 수있는 영역입니다. 이들은 C++ 시스템의 구현 자입니다 (예 : 컴파일러 및 표준 라이브러리 작성자).

당신은 반복자의 요소에 액세스 할 수 ...

it->... 
(*it). ... 

를 사용하고 싶습니다.

1

업데이트의 경우 : 반복기는 요소에 대해 "포인터와 유사"이므로 *it은 포함 된 요소를 참조합니다. 이지만이면 it->을 사용하여 요소의 멤버에 액세스 할 수 없습니다. 멤버 요소가 포인터이기 때문에 반복기는 이중 포인터와 비슷합니다.

긴 이야기를 짧게, 당신은 할 필요가 : *it 이후

(*it)->aabb; 

당신에게 QuadTreeOccupant*을 제공합니다, 당신은 -> 연산자를 통해 회원을 다음에 액세스 할 수 있습니다.

--- 편집 ---

너무 늦게

...

관련 문제