一方面,typename const Array<T>::Iterator
是错误的。应该是const typename Array<T>::Iterator
。因为typename
是为了帮助编译器知道如何处理 a 之后的内容::
,所以总是把它放在你的A::B::C
-type 模式的左边。
friend
在声明通用模板之前,您不能将函数模板的特化命名为 a 。在声明类型之前,您不能声明该模板Array<T>::Iterator
。
您可以做的一件事:使整个函数模板 a 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;
};