2014-10-16 2 views
1

boost :: filtered_range 클래스에 [] 연산자를 추가하고 싶습니다. 내 코드가있다 :boost :: filtered_range 값에 대한 참조 유형

template <typename TPredicate, typename TRange> 
class my_filtered_range : public boost::filtered_range<TPredicate, TRange> 
{ 
public: 
    my_filtered_range(TPredicate Predicate, TRange &Range) : boost::filtered_range<TPredicate, TRange>(Predicate, Range) 
    { 
    } 

    size_t size() const 
    { 
     return std::distance(begin(), end()); 
    } 

    ???? &operator[](size_t Index) const 
    { 
     assert(Index < size()); 
     auto It = begin(); 
     std::advance(It, Index); 
     return *It; 
    } 
}; 

문제는 [] 연산자에 대한 반환 형식으로 사용하는 유형이다는? Specifiyng 'value_type'이 'const'컨테이너와 함께 클래스를 사용할 수 없으며 "decltype (* begin())"이 VC++ 2013로 컴파일되지 않습니다.

+0

후행 반환 유형에서'decltype'을 사용하여'auto'를 시도 했습니까? – Kiroxas

답변

0

기본 클래스에서 boost::range_reference<> 특성을 사용할 수 있어야합니다. Live On Coliru 난 당신이 깨진 컴파일러 (MSVC)를 사용하는 감지 그래서 따라 기본 회원들과 유형에 필요한 자격 요건을 추가하는 방법

#include <boost/range/adaptors.hpp> 

template <typename TPredicate, typename TRange> 
class my_filtered_range : public boost::filtered_range<TPredicate, TRange> 
{ 
public: 
    typedef boost::filtered_range<TPredicate, TRange> base_type; 

    my_filtered_range(TPredicate Predicate, TRange &Range) : boost::filtered_range<TPredicate, TRange>(Predicate, Range) 
    { 
    } 

    size_t size() const 
    { 
     return std::distance(this->begin(), this->end()); 
    } 

    typename boost::range_reference<const base_type>::type operator[](size_t Index) const 
    { 
     assert(Index < this->size()); 
     auto It = this->begin(); 
     std::advance(It, Index); 
     return *It; 
    } 
}; 

.

+0

솔루션을 제공해 주셔서 감사합니다. "base_type"은 비공개입니다. boost :: range_reference 을 사용하면 작동합니다. – Raider

+0

Erm. @Raider,'base_type'은 ** private가 아닙니다 **. 나는 그 자체의 샘플에서 _ 정의한다! 당신은 아마도 기본 랭귀지에 대해 동일하다고 가정 할 수 있지만 일반적으로 올바른 것으로 가정 할 때 왜 가정합니까? – sehe

+0

알았습니다! 내 잘못을해서 미안해. – Raider

관련 문제