我们只有一个模板,Vector<T>
即 编译器允许这样的语法并没有什么特别的原因,以及是否需要像Vector
下面这样编写或者是否需要Vector<T>
为参数和返回值编写
提出问题的行包含评论
template <class T>
class Vector {
protected:
int length;
T *mas;
public:
Vector(int n);
Vector(const Vector &z); // здесь в параметре не Vector<T>
Vector(int n, T*a);
Vector() {};
~Vector();
int Length()const { return length; }
T& operator[](int i);
Vector& operator=(const Vector &right); // здесь в возвращаемом значении и параметре не Vector<T>
};
也在方法定义中
template <class T>
Vector<T>& Vector<T>::operator=(const Vector &right) { // здесь в параметре не Vector<T>
if(&right == this)
return *this;
if (right.length != length) {
delete[] mas;
length = right.length;
mas = new T[length];
}
for (int i = 0; i < length; ++i)
mas[i] = right.mas[i];
return *this;
}
在类定义或其方法中,没有模板参数的类名被识别为该模板的当前实例(当前实例化)。同时,在方法的外部定义中,前导返回值尚未在类的上下文中,因此如果不指定模板参数(如限定符)就无法识别
Vector<T>::
。但是参数列表和尾部返回值已经在类的上下文中,因此在不指定模板参数的情况下以及在类本身中声明它们时都会被识别:模板类的成员又是使用模板参数参数化的模板。在范围内,
Vector<T>
限定 c<T>
对于模板名称是多余的( T 是外部定义的参数,不参与同一专业化中的名称查找)。一样
返回值尚未限定范围,因此您需要使用限定符指定名称
Vector<T>