Как правильно работать в шаблонном классе с файлами?

Доброго времени суток.

У меня проблема. Была задача: разработать шаблонный класс, простенький, который хранит 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;
}

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