Объектно-ориентированное программирование на C++. Андрианова А.А - 118 стр.

UptoLike

Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
определении таких функций для шаблона класса неясен тип объекта,
который следует ввести или вывести. Этот тип зависит от типа данных,
для которого формируется объект на основе шаблона класса. Поэтому
дружественные функции ввода/вывода также должны быть шаблонными
и это должно быть указано при их объявлении в шаблоне класса:
class QMatrix
{
. . .
template <class T>
friend istream& operator >>
(istream& is, QMatrix<T>& ob);
template <class T>
ostream& operator << (ostream& os, QMatrix<T>& ob);
. . .
};
// шаблон операции ввода квадратной матрицы
template <class T>
istream& operator >> (istream& in, QMatrix<T>& ob)
{
if(ob.n != 0)
{
for(int i = 0; i < ob.n; i++)
for(int j = 0;j < ob.n; j++)
in >> ob[i][j];
}
return in;
}
// шаблон операции вывода квадратной матрицы
template <class T>
ostream& operator << (ostream& out, QMatrix<T>& ob)
{
if(ob.n != 0)
{
out << "Матрица:" << endl;
for(int i = 0; i < ob.n; i++)
{
for(int j = 0; j < ob.n; j++)
out << ob[i][j] << "\t";
out << endl;
}
}
else
out << "Матрица пуста" << endl;
return out;
}
118
                               Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
определении таких функций для шаблона класса неясен тип объекта,
который следует ввести или вывести. Этот тип зависит от типа данных,
для которого формируется объект на основе шаблона класса. Поэтому
дружественные функции ввода/вывода также должны быть шаблонными
и это должно быть указано при их объявлении в шаблоне класса:

      class QMatrix
      {
      .    .    .
           template 
           friend istream& operator >>
                               (istream& is, QMatrix& ob);
           template 
           ostream& operator << (ostream& os, QMatrix& ob);
           .    .    .
      };

      // шаблон операции ввода квадратной матрицы
      template 
      istream& operator >> (istream& in, QMatrix& ob)
      {
           if(ob.n != 0)
           {
                for(int i = 0; i < ob.n; i++)
                     for(int j = 0;j < ob.n; j++)
                          in >> ob[i][j];
           }
           return in;
      }

      // шаблон операции вывода квадратной матрицы
      template 
      ostream& operator << (ostream& out, QMatrix& ob)
      {
           if(ob.n != 0)
           {
                out << "Матрица:" << endl;
                for(int i = 0; i < ob.n; i++)
                {
                     for(int j = 0; j < ob.n; j++)
                          out << ob[i][j] << "\t";
                     out << endl;
                }
           }
           else
                out << "Матрица пуста" << endl;
           return out;
      }

118