2012-02-07 3 views
2

아래의 템플릿 클래스를 오버로드하는 방법은 무엇입니까? 다음과 같은템플릿 클래스 및 연산자 오버로드

template <class T> 
const_iterator& List<T>::const_iterator::operator++() 
{ 
    current = current->next; 
    return *this; 
} 

template <class T> 
const_iterator List<T>::const_iterator::operator++(int) 
{ 
    const_iterator old = *this; 
    ++(*this); 
    return old; 
} 

나는 점점 오전 오류 : 리턴 유형이 지정된시

List.cpp:17: error: expected constructor, destructor, or type conversion before ‘&’ token 
List.cpp:23: error: expected constructor, destructor, or type conversion before ‘List’ 
List.cpp:30: error: expected constructor, destructor, or type conversion before ‘&’ token 
List.cpp:35: error: expected constructor, destructor, or type conversion before ‘List’ 
+2

'유형 이름 목록 :: const_iterator를 & 목록 :: const_iterator를 :: 연산자 ++()' –

답변

3
template <class T> 
typename List<T>::const_iterator& List<T>::const_iterator::operator++() 

, 당신은 List<T>의 소위 어휘 범위 내에서 아니에요. 그리고 enclater 범위에 타입 const_iterator이 없으므로 오류가 발생합니다 (IMHO를 약간 더 잘 나타낼 수는 있지만).

template<class T> 
auto List<T>::const_iterator::operator++() 
    -> const_iterator& 
{ 
    // ... 
} 

그러나, 좋은 생각 그냥 클래스 자체에 인라인 이런 일을 정의하는 것입니다 : C++ 11

또 다른 옵션은 후행 반환 형식 일 수 있습니다. 당신은 클래스 외 정의에 대한 특별한 이유가 있습니까?

+0

FWIW, GCC 4.6의 모든, 4.7 연타 3.1 "const_iterator를이 형식이 아닙니다"고 불평하고있다. OP가 GCC 4.5를 사용하고있는 것 같습니다. –

+0

OSX가 업데이트하는 GCC 버전을 사용하고 있습니다. 그리고 수업 중에 건물을 짓지 않는 이유는 이것이 과제 과제의 일부이기 때문입니다. – jordaninternets

+0

또한 답변으로 받아 들일 수있을 때까지 기다리는 동안 빠른 질문입니다. 이 형식을 T 형식으로 정확하게 지정하는 방법은 무엇입니까? '템플릿 T & List :: const_iterator :: retrieve() {// 목록에서 해당 요소에 대한 참조를 반환합니다. return current-> data; }' – jordaninternets