#include <iostream>

using namespace std;

template <typename T> class Tablica2W
{
  private:
    unsigned K;
    unsigned R;
    class Elementy
    {
      private:
        T *Tab;
      public:
        Elementy():Tab(0) {}
        Elementy(unsigned K, unsigned R) { Tab = ((R==K)!=0)?new T[K*R]:0; }
        friend class Tablica2W<T>;
        friend ostream &operator<<(ostream &s, const Tablica2W<T> &Tablica);
    };
    Elementy el;
  public:
    Tablica2W():K(0), R(0) {}
    Tablica2W(unsigned K, unsigned R): K(K), R(R), el(K, R) {}
    unsigned Kolumny() { return K; }
    unsigned Rzedy() { return R; }
    friend ostream &operator<<(ostream &s, const Tablica2W<T> &Tablica);
    friend ostream &operator<<(ostream &s, Tablica2W<T> &Tablica);
};

template <typename T> ostream &operator<<(ostream &s, const Tablica2W<T> &Tablica)
{
  for (unsigned r=0; r<Tablica.Rzedy(); r++)
  {
    for (unsigned k=0; k<Tablica.Kolumny(); k++)
    {
      cout << Tablica.el.Tab[r*Tablica.Kolumny()+k] << " ";
    }
    cout << endl;
  }
  return s;
}

template <typename T> ostream &operator<<(ostream &s, Tablica2W<T> &Tablica)
{
  for (unsigned r=0; r<Tablica.Rzedy(); r++)
  {
    for (unsigned k=0; k<Tablica.Kolumny(); k++)
    {
      cout << Tablica.el.Tab[r*Tablica.Kolumny()+k] << " ";
    }
    cout << endl;
  }
  return s;
}

int main()
{
  Tablica2W<double> Tab(10,10);
  cout << Tab;
  return 0;
}

