Как правильно работать в шаблонном классе с файлами?
Доброго времени суток.
У меня проблема. Была задача: разработать шаблонный класс, простенький, который хранит 3 числа.
Я разработал это. Все работало, но есть проблема: вывод информации в файл и ввод информации из файла в поля объекта.
Если проще, то я должен взять первый объект, записать его поля в файл. Потом взять второй, и заполнить его поля значениями из этого файла.
Вроде код есть, но на компиляции 3 ошибки линковки, которые, мягко говоря, я вообще не понимаю.
Буду очень благодарен за помощь)
Ошибки:
Код:
#include <iostream>
#include <fstream>
using namespace std;
template <typename T1, typename T2, typename T3>
class Parallelepiped;
template <typename T1, typename T2, typename T3>
ostream& operator<<(ostream& os, const Parallelepiped<T1, T2, T3>& obj) {
os << obj.edge_1 << " " << obj.edge_2 << " " << obj.edge_3;
return os;
}
template <typename T1, typename T2, typename T3>
istream& operator>>(istream& is, Parallelepiped<T1, T2, T3>& obj) {
is >> obj.edge_1 >> obj.edge_2 >> obj.edge_3;
return is;
}
template <typename T1, typename T2, typename T3>
class Parallelepiped {
friend ostream& operator<<(ostream& os, const Parallelepiped<T1, T2, T3>& obj);
friend istream& operator>>(istream& is, Parallelepiped<T1, T2, T3>& obj);
private:
T1 edge_1; // специально сделал 3 шаблона для того, чтобы работать с абсолютно разными типами
T2 edge_2;
T3 edge_3;
public:
Parallelepiped() {
edge_1 = 0;
edge_2 = 0;
edge_3 = 0;
cout << "Отработал конструктор по умолчания. Ребра обнулены. Область -->> " << this << endl;
}
Parallelepiped(T1 e1, T2 e2, T3 e3) {
edge_1 = e1;
edge_2 = e2;
edge_3 = e3;
cout << "Отработал конструктор с параметрами. Область -->> " << this << endl;
}
Parallelepiped(const Parallelepiped& obj) {
this->edge_1 = obj.edge_1;
this->edge_2 = obj.edge_2;
this->edge_3 = obj.edge_3;
cout << "Отработал конструктор копирования. Область -->> " << this << endl;
}
void Initialization(void) {
cout << "\n---------------------------------\n";
cout << "\n\nВведите длину первого ребра параллелепипеда -->> "; cin >> edge_1;
cout << "\n\nВведите длину второго ребра параллелепипеда -->> "; cin >> edge_2;
cout << "\n\nВведите длину третьего ребра параллелепипеда -->> "; cin >> edge_3;
cout << "\n---------------------------------\n";
}
void Show(void) {
cout << "\n---------------------------------\n";
cout << "\n\nДлина первого ребра параллелепипеда -->> " << edge_1;
cout << "\n\nДлина второго ребра параллелепипеда -->> " << edge_2;
cout << "\n\nДлина третьего ребра параллелепипеда -->> " << edge_3;
cout << "\n---------------------------------\n";
}
~Parallelepiped() {
cout << "Отработал деструктор. Область -->> " << this << endl;
}
};
int main()
{
setlocale(0, "");
Parallelepiped<int, int, int> p1;
Parallelepiped<int, float, float> p2;
p1.Initialization();
p2.Initialization();
p1.Show();
p2.Show();
ofstream fout;
fout.open("1.txt");
fout << p1;
fout.close();
ifstream fin;
fin.open("1.txt");
fin >> p2;
fin.close();
return 0;
}
