Re: Не работает operator-друг с шаблонным классом.
От: Павел Кузнецов  
Дата: 14.10.02 16:58
Оценка: 13 (2)
Здравствуйте Melo_AG, Вы писали:

MA>При попытке перегрузить оператор << для шаблонного класса компилятор выдает сообщение, что закрытые члены класса не доступны, хотя функция operator<< объявлена дружественной данному шаблонному классу. Ума не приложу — что не так?


<...>

operator << тоже является шаблоном:

#include <iostream>
#include <vector>

using namespace std;

template <class T> class MyMatrix;

template <class T> 
ostream& operator<<(ostream& os, MyMatrix<T>& m);

template <class T> class MyMatrix
{
    vector<vector<T> > Matr;
        int Rows, Columns;
        //...

 public:
        //...

  friend ostream& operator<<(ostream& os, MyMatrix<T>& m);
  // вообще-то "правильнее":
  // friend ostream& operator<< <T>(ostream& os, MyMatrix<T>& m);
  // но VC++6.0 этого "не поймет"

        //...
};

template <class T> ostream& operator<<(ostream& os, MyMatrix<T>& m)
{
    for ( int i=0; i<m.Rows; i++ )
    {
        for ( int j=0; j<m.Columns; j++ ) os<<m.Matr[i][j]<<'\t';
        os<<endl;
    }
    return os;
}

int main()
{
    MyMatrix<int> mmatr;
    cout<<mmatr; //точка инстанцирования оператора <<
    return 0;
}
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Не работает operator-друг с шаблонным классом.
От: Melo_AG  
Дата: 14.10.02 16:45
Оценка:
При попытке перегрузить оператор << для шаблонного класса компилятор выдает сообщение, что закрытые члены класса не доступны, хотя функция operator<< объявлена дружественной данному шаблонному классу. Ума не приложу — что не так?

using namespace std;

template <class T> class MyMatrix;

ostream& operator<<(ostream& os, MyMatrix<T>& m);

template <class T> class MyMatrix
{
    vector<vector<T>> Matr;
        int Rows, Columns;
        //...

 public:
        //...

  friend ostream& operator<<(ostream& os, MyMatrix<T>& m);
        //...

}

template <class T> ostream& operator<<(ostream& os, MyMatrix<T>& m)
{
    for ( int i=0; i<m.Rows; i++ )
    {
        for ( int j=0; j<m.Columns; j++ ) os<<m.Matr[i][j]<<'\t';
        os<<endl;
    }
    return os;
}

void main()
{
    MyMatr<int> mmatr(5,5);
    cout<<mmatr; //точка инстанцирования оператора <<

}


Для простоты все это объявленно в одном файле.
Причем разные компилеры "ругаются" по-разному. Например у BC 5.5 вообще линкер выбрасывает ошибку при попытке инстанцирования. Зараннее признателен всем, кто поможет.
Re[2]: Не работает operator-друг с шаблонным классом.
От: Melo_AG  
Дата: 14.10.02 17:23
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

//...

ПК> friend ostream& operator<<(ostream& os, MyMatrix<T>& m);

ПК> // вообще-то "правильнее":
ПК> // friend ostream& operator<< <T>(ostream& os, MyMatrix<T>& m);
ПК> // но VC++6.0 этого "не поймет"

//...

Только что проверил Вашу "поправку" на BC 5.5 и, О чудо!, сразу же заработало! ОГРОМНЕЙШЕЕ СПАСИБО, я Ваш должник!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.