2013-06-03 1 views
2

나는 모든 종류의 선언을 시도해 왔지만 구문 오류 및 링크 오류와 같은 모든 종류의 오류가 발생하는 것은 적절하지 않습니다. 이것이 나에게 어떤 의미가있는 마지막 시도입니다. 내가 뭘 잘못 했니?템플릿 클래스의 중첩 클래스를 사용하는 전역 friend 함수를 선언하는 방법은 무엇입니까?

template<class T> 
class Array 
{ 
public: 
    class Iterator 
    { 
    public: 
    friend Iterator operator+<>(const int,typename const Array<T>::Iterator&); 
    }; 
}; 

template <class T> 
typename Array<T>::Iterator operator+(const int,typename const Array<T>::Iterator& it) 
{ 
    return it; 
} 

주가 :

error C2785: 'Array<T>::Iterator operator +(const int,const Array<T>::Iterator &)' and 'Array<T>::Iterator +(const int,const Array<T>::Iterator &)' have different return types 
+0

'void main()'은 적법하지 않습니다. C++. –

+0

맞아 ... 늙은 습관이 많이 죽어. – petric

+5

'당신의 권리 '는 법적인 영어가 아닙니다 : P –

답변

3

우선, typename const Array<T>::Iterator 잘못 :

int main() 
{ 
    Array<int> arr; 
    Array<int>::Iterator it; 
    it=5+it; 
    return 0; 
} 

나는이 오류가 발생합니다. const typename Array<T>::Iterator이어야합니다. typename은 컴파일러가 :: 이후에 무엇을해야할지 알 수 있도록하기 때문에 항상 A::B::C 유형 패턴 왼쪽에 넣습니다.

일반 템플릿이 선언되기 전에 기능 템플릿의 전문화를 friend으로 지정할 수 없습니다. 그리고 Array<T>::Iterator 유형이 선언 될 때까지 템플릿을 선언 할 수 없습니다.

할 수있는 한 가지 : 하나의 전문화가 아닌 전체 기능 템플릿을 friend으로 만드십시오.

template<class T> 
class Array 
{ 
public: 
    class Iterator 
    { 
    public: 
     template <class U> friend 
     typename Array<U>::Iterator operator+(
      const int, const typename Array<U>::Iterator&); 
    }; 
}; 

template <class T> 
typename Array<T>::Iterator operator+(
    const int, const typename Array<T>::Iterator& it) 
{ 
    return it; 
} 

friend 배를 부여에서 약간의 실수,하지만 작업이 이루어집니다.

또는 나중에 파일의 중첩 클래스 Iterator의 정의 이동하고자하는 경우 :

template<class T> 
class Array 
{ 
public: 
    class Iterator; 
}; 

template <class T> 
typename Array<T>::Iterator operator+(
    const int, const typename Array<T>::Iterator& it); 

template <class T> 
class Array<T>::Iterator 
{ 
public: 
    friend Iterator operator+<T>(const int, const Iterator&); 
}; 

template <class T> 
typename Array<T>::Iterator operator+(
    const int, const typename Array<T>::Iterator& it) 
{ 
    return it; 
} 

선언을 정의하는 방법을 처리합니다. 불행하게도,이 operator+은 .... 때문에 템플릿 인수 공제 규칙의 세부 사항을 사용하기 쉽지 않다

아마 비 중첩 템플릿 Iterator함으로써이 마지막 문제를 해결 받고 시도 할

:

namespace Array_detail { 
    template <class T> class Array_Iterator; 

    template <class T> 
    Array_Iterator<T> operator+(int, const Array_Iterator<T>&); 

    template <class T> 
    class Array_Iterator { 
     friend Array_Iterator operator+<>(int, const Array_Iterator&); 
    }; 
} 

template <class T> 
class Array { 
public: 
    typedef Array_detail::Array_Iterator<T> Iterator; 
}; 
+0

thx mate! 그것은 매우 도움이되었습니다. 마음에 들지 않으면 한 번 더 질문합니다.이 연산자에 과부하가 걸리는 이유는 무엇입니까? 실수를 피하기 위해 어떻게해야합니까? – petric

+0

답변에 더 많은 것을 추가했습니다. – aschepler

+0

다시 한 번 고맙다. – petric

관련 문제