우선, 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;
};
'void main()'은 적법하지 않습니다. C++. –
맞아 ... 늙은 습관이 많이 죽어. – petric
'당신의 권리 '는 법적인 영어가 아닙니다 : P –