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