2013-07-24 5 views
0

다음 코드는 정말 유용합니다. Iterating over keys/values 것은 std :: maps (ValueGetter가 조정해야 함)에서 작동하지만 다음 코드가 std :: vector에서도 작동하지 않는 이유는 무엇입니까? 나는 다른 컨테이너에서 상속받을 수있는 SpecialList 클래스에 코드를 넣었습니다 ... 문제는 (*it)의 끝에 있습니다. 나는 이것이 왜 컴파일되지 않는지 이해하지 못한다. (MWE)std :: vector 및 C++ (MWE)의 다른 컨테이너에서 키/값 반복하기

#include <functional> 
#include <map> 
#include <boost/iterator/transform_iterator.hpp> 


class A{ 
public: 
    A(int i):a(i){} 
    int a; 
}; 

template <typename T> 
struct ValueGetterVec : std::unary_function<typename std::vector<T>::iterator::value_type, 
              typename std::vector<T>::iterator::value_type> 
{ 
    const typename std::vector<T>::iterator::value_type& operator() 
    (const typename std::vector<T>::iterator::value_type & p) const 
    { return p;} 
}; 

class SpecialList : public std::vector< A* > { 
    public: 

    typedef boost::transform_iterator< ValueGetterVec<iterator>, iterator>  
    value_iterator; 

    value_iterator beginValueIterator() 
    { 
     return value_iterator(this->begin(), ValueGetterVec<iterator>()); 
    } 

    value_iterator endValueIterator() 
    { 
     return value_iterator(this->end(), ValueGetterVec<iterator>()); 
    } 

}; 

SpecialList list; 
list2.push_back(new A(1)); 
list2.push_back(new A(2)); 
{ 
    SpecialList::value_iterator it; 

    for(it = list.beginValueIterator(); it != list.endValueIterator(); it++){ 
     std::cout << (*it)->a << std::endl; 
    } 
} 

답변

0

오류 실측치 : 교체를 ValueGetterVec<iterator> ==>ValueGetterVec<A*>