При попытке перегрузить оператор << для шаблонного класса компилятор выдает сообщение, что закрытые члены класса не доступны, хотя функция 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 вообще линкер выбрасывает ошибку при попытке инстанцирования. Зараннее признателен всем, кто поможет.
Здравствуйте 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;
}
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен