我一直在尝试各种各样的声明,但没有做对,得到各种错误,如语法错误和链接错误。 这是对我有意义的最后一次尝试。 我做错了什么?
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;
}
和主要:
int main()
{
Array<int> arr;
Array<int>::Iterator it;
it=5+it;
return 0;
}
我收到此错误:
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 :(得分:3)
首先,typename const Array<T>::Iterator
是错误的。它应该是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;
};