2011-11-13 2 views
0

의 집합 클래스의 회원 액세스 나는 다음과 같은 클래스의 객체에 대한 포인터의 집합이C의 ++의 STL 포인터

void print_by_rank(set<name_id *> &nameIdSet, map<int, int> &votesMap) 
{ 
    vector<string> names; 
    vector<string>::iterator names_it; 

    set<name_id *>::iterator nameIdSet_it; 
    for(nameIdSet_it = nameIdSet.begin(); nameIdSet_it != nameIdSet.end(); ++nameIdSet_it) 
     //names.push_back(nameIdSet_it->name); 
     cout << nameIdSet_it->name << endl; 
} 

그러나 하단 두 줄 중 어느 것도 컴파일되지 않습니다.

g++ -o bobwinner bobwinner.cpp 
bobwinner.cpp: In function 'void print_by_rank(std::set<name_id*, std::less<name_id*>, std::allocator<name_id*> >&, std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >&)': 
bobwinner.cpp:68: error: request for member 'name' in '* nameIdSet_it.std::_Rb_tree_const_iterator<_Tp>::operator-> [with _Tp = name_id*]()', which is of non-class type 'name_id* const' 

내가 개체에 설정된 요소 포인트의 이름 필드에 액세스 할 수 반복자의 화살표 연산자를 사용할 수없는 이유를 이해가 안 : 나는 다음과 같은 메시지가 나타납니다.

답변

5

포인터를 가져 오기 위해 이터레이터를 참조 해제해야합니다. 그런 다음 포인터를 역 참조하여 객체 자체를 가져와야합니다. 그래서 당신은 아마 원하는 :

cout << (*nameIdSet_it)->name << endl; 
+0

어떤 도움이된다면'(* (* nameIdSet_it))와 동일합니다. 'name –

+0

이런, 그게 내가 시도하지 않은 유일한 것일뿐입니다. 감사! – user434462

+2

Downvoter : 관심있는 댓글? –

0

당신은 반복자 역 참조해야하고, 자체 즉, 당신이 다시 역 참조 할 필요가 포인터, 제공 : 것을 컴파일을 넘어

(*nameIdSet_it)->name 
^^^^^^^^^^^^^^^ 
    this is a pointer 
+0

우수, 감사합니다! 말이된다. – user434462

0

을, 당신은 또한에있어 왜냐하면 포인터 집합은 기본 객체에 대한 비교 자에 의해 정렬되지 않으므로 놀랍기 때문에 이것은 생각하는대로 작동하지 않을 것입니다.

+0

글쎄, 그것은 호기심이 과제 (예, 나는 학생)입니다. 나 자신을 정렬을 구현해야합니다. 하지만 팁 주셔서 감사합니다! – user434462