у нас есть только шаблон 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;
}
Внутри определения класса или его методов имя класса без параметров шаблона распознается как текущий инстанс этого шаблона (current instantiation). При этом во внешнем определении метода лидирующее возвращаемое значение еще не находится в контексте класса и поэтому не распознается без указания параметров шаблона, как и квалификатор Vector<T>::
. Зато список аргументов и хвостовое возвращаемое значение уже будут в контексте класса и поэтому будут распознаваться и без указания параметров шаблона, как и при объявлении их внутри самого класса:
template <class T> auto
Vector<T>::operator=(const Vector &right) -> Vector& // здесь в возвращаемом значении и параметре не Vector<T>
Члены шаблонного класса в свою очередь являются шаблонами, параметризованными при помощи аргументов шаблона. Внутри области видимости Vector<T>
квалификация с <T>
избыточна для имени шаблона( T является параметром, определенным внешным образом, и не участвуют в поисках имени в пределах одной специализации).
template <class T>
Vector<T>& Vector<T>::operator=(const Vector &right)
То же самое, что и
template <class T>
Vector<T>& Vector<T>::operator=(const Vector<T> &right)
Для возвращаемого значения пока не определен область видимости, поэтому нужно указать имя с квалификатором Vector<T>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пытаюсь разобраться в многопоточности и mutexПо задумке сначала должен выполниться thread Calc(Stream), после его окончания должен выполниться thread...