Проблема с созданием переменных шаблонного класса на с++

изучаю с++ и шаблонные классы не так давно и еще не понимаю, как исправить все возникающие ошибки (гугл не помог). В данном коде я встретилась с ошибкой в 111-112 строке, а также в 126 и 128 (Мне надо было составить шаблон и создать переменные типа int и double, но мне кажется, что я многое сделала не так)

#include <iostream>
#include <string>
using namespace std;

template <class T>
class Vector{
    int size;
    T* data;
public:
    const int Size();
    T& operator [](int n);
    T* operator*(int n);
    int operator()();
    friend ostream& operator<< <>(ostream& out, const Vector<T>*& a);
    friend istream& operator>> <>(istream& in, Vector<T>*& a);
    ~Vector() {
        delete[]data;
        data = 0;
    };
};

template <class  T>
const int Vector<T>::Size(){
    return size;
}

 template <class T>
 T& Vector<T>::operator[](int n) {
     if (n < size) {
         return data[n];
     }
     else
         cout<<"\nОшибка получения индекса!";
 }

 template <class T>
 T* Vector<T>::operator*(int n) {
     for (int i = 0; i <= size; i++) {
         data[i] = data[i] * n;
         return data;
     }
 }

 template <class T>
 int Vector<T>::operator()() {
     return size;
 }

 template <class T>
 ostream& operator<<<>(ostream& out, const Vector<T>*&){
     for (int i = 0; i < size; i++) {
         out << data[i]<<" ";
         return out;
     }
 }

 template <class T> 
 istream& operator>>(istream& in, Vector<T>*&) {
     for (int i = 0; i < size; i++) {
         in >> data[i];
         return in;
     }
 }

class Point {
     double x, y, z;
public:
    Point() {
        x = y = z = 0.0;
    }
    Point(const Point& t) {
        x = t.x;
        y = t.y;
        z = t.z;
    }
    Point(double x, double y, double z) {
        this-> x = x;
        this-> y = y;
        this-> z = z;
    }
    ~Point() {};
    Point& operator=(const Point&t) {
        x = t.x;
        y = t.y;
        z = t.z;
        return *this;
    };
    friend ostream& operator<< (ostream& out, const Point&t) {
        out << "( " << t.x << "; " << t.y << "; " << t.z << ")";
    };
    friend istream& operator>> (istream& in, Point&t) {
        cout << "x?";
        in >> t.x;
        cout << "y?";
        in >> t.y;
        cout << "z?";
        in >> t.z;
        return in;
    };
    Point operator*(int i) {
        return Point(x * i, y * i, z * i);
    }
};

 int main() {
     setlocale(LC_CTYPE, "rus");
     int N = 9;
     int q = 6, w = 2, e = 6;
     Point p(2.1, 6.4, 4.3);
     
     Vector<int> v1(q);
     Vector<Point> v2(p);

     try {
         for (int i = 0; i < N; i++) {
             if (i > v2.Size()) {
                 throw - 1;
                 cout << v1[i + 1] << endl;
             }
         }
     }
     catch (int) {
         cout << "Индекс выходит за пределы 2 вектора\n";
     }
     cout << "Вывод элементов вектора типa int: \n";
     cout << "v1 = " << v1 << endl;
     cout << "Вывод элементов вектора типa double: \n";
     cout << "v2 = " << v1 << endl;
     cout << "size v1 = " << v1.Size() << endl;
     cout << "size v2 = " << v2.Size() << endl;
     Point A(1.91, 2.07, 3.31), B(2, 3, 4);
     cout << "A = " << A << endl;
     cout << "B = " << B << endl;
     A = A * 5;
     cout << "A * 5 = " << A << endl;
 }

Ответы (1 шт):

Автор решения: Harry

Интересные у вас операторы: ostream& operator<<<>

Вобщем, несколько замечаний. Сначала разберитесь с ними, а потом будем думать над остальным.

Итак, операторы - << и >>. Передавать им лучше ссылку на класс, а не на указатель. Это - свободные функции, так что писать просто size или data без указания объекта - нельзя. Примерный набросок, как надо:

template <class T>
ostream& operator<<(ostream& out, const Vector<T>&v){
    for (int i = 0; i < v.size; i++) {
        out << v.data[i]<<" ";
        return out;
    }
}

Для оператора >> учтите, что вы читаете заранее определенное объектом количество данных, а это не то чтобы нельзя, но error-prone...

Не ошибка, просто бессмыслица возвращать const int:

const int Size();

Вы пытаетесь создавать

Vector<int> v1(q);
Vector<Point> v2(p);

но у вас нет соответствующих конструкторов (не никаких вообще!). В первом случае, как я понимаю, q - количество элементов, тут хоть понятно, что делать -

Vector(int q):size(q),data(new T[q]){}

Во втором вы передаете один элемент? Именно так? Тогда пишите конструктор

Vector(const T&);

Тут

for (int i = 0; i < N; i++) {
     if (i > v2.Size()) {

вообще непонятно. Последний допустимый индекс на 1 меньше размера массива. Или у вас сам массив размером size+2? конструктора-то у вас нет, откуда мне знать? А вы еще и обращаетесь к v1[i + 1] - а тут уж опять никаких гарантий. Хотите проверять выход за границы массива - перенесите ее в оператор [].

Ну, для начала достаточно, работайте...

→ Ссылка