------- Comment #7 from yimingli0126 at 163 dot com  2009-09-02 10:33 -------
Thanks.

I have added explicit copy constructors both Inner(Inner const&) and
Inner(Inner&) to the class Inner, which are superior to template < class
IStream > Inner (IStream&) when the complier decides which should be called, so
that now the codes work well.

Here are the new sample codes:

struct Inner {
  template < class IStream > friend IStream& operator >> ( IStream& in, Inner&
inner );

  Inner() : data(0) {}
  Inner( Inner const& inner ) : data(inner.data) {} // Make the class
copy-constructable.
  Inner( Inner& );  // Only declaration is necessary fo gcc.
  template < class IStream > explicit Inner( IStream& in ) { operator >>
(in,*this); }

  int data;
};

template < class IStream >
IStream& operator >> ( IStream& in, Inner& inner )
{
  in >> inner.data;
  return in;
}

struct Outter {
  template < class IStream > friend IStream& operator >> ( IStream& in, Outter&
outter );

  Outter() {}
  Outter( Outter const& outter) {}  // Make the class copy-constructable.
  Outter( Outter& );  // Only declaration is necessary.
  template < class IStream > explicit Outter( IStream& in ) { operator >>
(in,*this); }

  std::vector<Inner> inners;
};

template < class IStream >
IStream& operator >> ( IStream& in, Outter& outter )
{
  outter.inners.push_back(Inner(in));
  return in;
}

int main ( int argc, char* argv[] )
{
  Inner inner(std::cin);
  Outter outter(std::cin);
  return 0;
}

Actually, becuase there is a delcaration of Inner(Inner&), the instance of
template < class IStream > Outter( IStream& ) with IStream = Inner is
suppressed.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41216

Reply via email to