2014-04-08 4 views
1

이와 비슷한 작업을 수행 할 수 있습니까? 특히 내부 유형을 템플릿 매개 변수로 사용하여 템플릿 클래스를 상속 함

template<class T> struct A { 

}; 

struct B : public A<B::X> { 
    typedef string X; 
}; 

가, 내가 Enumerator를 작성하는 것을 시도하고, 그 또한 카운터와 몇 가지 다른 기능에 대한 반복자 값을 보유하는 개체에 대한 반복과 역 참조 수와 추가로 제공하는 액세스를 계산하는 반복자 래퍼입니다 . 순간에 당신이 B::X 사용하기 때문에 당신이, 유형 B::X (또는 그 문제에 대한 클래스 B가) 완전히 선언되지 수 없습니다

template<class Iterator> 
struct Enumerator : public iterator<input_iterator_tag, Enumerator<Iterator>::value_type> 
{ 
    typedef size_t counter_type; 

    struct value_type 
    { 
     counter_type i; 
     const typename Iterator::value_type& a; 
     value_type(const counter_type& i, const typename Iterator::value_type& a) : i(i), a(a) {} 
    }; 

    counter_type i; 

    Iterator it; 

    Enumerator() : i(0), it() {} 
    Enumerator(const Iterator & it) : i(0), it(it) {} 

    bool operator==(const Enumerator& a) const {return this->it==a.it;} 
    bool operator!=(const Enumerator& a) const {return this->it!=a.it;} 

    Enumerator& operator++() {++this->i; ++this->it; return *this;} 
    Enumerator operator++(int) {Enumerator tmp(*this); this->operator++(); return tmp;} 

    const value_type& operator*() const {return value_type(i,*this->it);} 
}; 

답변

0

아니, B 그 시점에서 불완전한 유형이 불완전한 유형에 사용할 수 없습니다

struct B : public A<std::string> 
{ 
    typedef std::string X; 

    ... 
}; 

또는처럼 템플릿 매개 변수에 대한 기본 유형뿐만 아니라 B 템플릿 기반 구조를 만들 중첩 된 이름 지정자.

당신은 다른 클래스 (아래 EnumeratorBase)에 구조체의 정의를 이동 한 다음이 같은 것을 할 수있는 : 당신은 내가 준 확장 반복자의 예에서 보듯이, 정말 A.을 수정할 수 없습니다

template<class Iterator> 
struct Enumerator 
    : private EnumeratorBase<Iterator> 
    , public iterator<input_iterator_tag, EnumeratorBase<Iterator>::value_type> 

{ 
    using typename EnumeratorBase<Iterator>::value_type;  
}; 
+0

이것이 효과가있을 것이라고 생각합니다. 감사합니다 – user3503380

+0

이 경우에는 using 키워드가 작동하지 않습니다 ('error : 알 수없는 type name 'value_type''). 그러나 또 다른 typedef typedef typename iterator :: value_type> :: value_type value_type;'in 파생 된 클래스 열거 자 않습니다. 왜 여기에 쓸모가 없습니까? – user3503380

+0

아,'typename을 사용하면 나를 위해 작동합니다. – user3503380

0

Can I do something like this?

아니,이처럼. 당신의 B에에 다음 typedef

template<class T> struct A { 
    typedef T t_type; 
}; 

과 :

대안은 A 클래스의 형식 정의를 추가하는 것입니다

struct B : public A<string> { 
    typedef t_type X; 
}; 

Live demo

+0

를 I @ jrok의 대답은 갈 길입니다. – user3503380

0

불행하게도 아니, 그렇지 않아 가능한. struct B : public A<B::X>이있을 때 유형 이명 B::X이 아직 존재하지 않기 때문입니다.

그러나 어떤 유형이 X인지 알면 그 대신 실제 유형을 사용하십시오.

template<typename T = std::string> 
struct B : public A<T> 
{ 
    typedef T X; 

    ... 
}; 
+0

불행히도, 나는'X' 타입을 모른다. 어쩌면 단순화 된 예제를 너무 단순화했을 수도 있습니다. 더 긴 코드 스 니펫에서 볼 수 있듯이, 상속받은 클래스'iterator'에 대한 템플릿 매개 변수는 상속 클래스 인'Enumerator'의 템플릿 매개 변수'Iterator'에 의존합니다. – user3503380

관련 문제