синтаксис в шаблонном классе

121
13 февраля 2022, 16:10

у нас есть только шаблон 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;
}
Answer 1

Внутри определения класса или его методов имя класса без параметров шаблона распознается как текущий инстанс этого шаблона (current instantiation). При этом во внешнем определении метода лидирующее возвращаемое значение еще не находится в контексте класса и поэтому не распознается без указания параметров шаблона, как и квалификатор Vector<T>::. Зато список аргументов и хвостовое возвращаемое значение уже будут в контексте класса и поэтому будут распознаваться и без указания параметров шаблона, как и при объявлении их внутри самого класса:

template <class T> auto
Vector<T>::operator=(const Vector &right) -> Vector& // здесь в возвращаемом значении и параметре не Vector<T>
Answer 2

Члены шаблонного класса в свою очередь являются шаблонами, параметризованными при помощи аргументов шаблона. Внутри области видимости 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>

READ ALSO
thread.join() Почему потоки вызываются в случайном порядке? С++

thread.join() Почему потоки вызываются в случайном порядке? С++

Пытаюсь разобраться в многопоточности и mutexПо задумке сначала должен выполниться thread Calc(Stream), после его окончания должен выполниться thread...

163
Ругается компилятор

Ругается компилятор

Ошибка компиляции на cols во вложенном цикле:

89
Выводится лишний текст в окне winapi

Выводится лишний текст в окне winapi

Подскажите, Как исправить ввод лишних символов?

78