Проблема с созданием переменных шаблонного класса на с++
изучаю с++ и шаблонные классы не так давно и еще не понимаю, как исправить все возникающие ошибки (гугл не помог). В данном коде я встретилась с ошибкой в 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 шт):
Интересные у вас операторы: 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] - а тут уж опять никаких гарантий. Хотите проверять выход за границы массива - перенесите ее в оператор [].
Ну, для начала достаточно, работайте...