
struct bar;
struct foo
{
   operator bar* ();
};

class Foo {
   Foo operator + (const Foo& rhs) const;

   const Foo& operator == (Foo& me);

   bool operator > (const Foo& rhs) const;

   InStream& operator << (InStream& in);
}

const Foo& Foo::operator == (Foo& me)
{
}

Foo Foo::operator + (const Foo& rhs) const
{
}

bool Foo::operator > (const Foo& rhs) const
{
}

class Example
{
   char m_array[256];

   Example& operator = (const Example& rhs);
   Example& operator += (const Example& rhs);
   const Example operator + (const Example& other) const;
   bool operator == (const Example& other) const;
   bool operator != (const Example& other) const;
   Example operator + (const Example& x, const Example& y);
   Example operator * (const Example& x, const Example& y);

   double& operator () (int row, int col);
   double operator () (int row, int col) const;
   void operator ++ ();
   int& operator * ();
   Example& operator ++ ();   // prefix ++
   Example operator ++ (int); // postfix ++

   bool operator < (const Example& lhs, const Example& rhs) const;

   int operator () (int index)
   {
      i = ~~3;
      return index + 1;
   }

   char& operator [] (unsigned i)
   {
      return m_array[i & 0xff];
   }
}
bool Example::operator == (const Example& other) const
{
   /*TODO: compare something? */
   return false;
}
bool Example::operator != (const Example& other) const
{
   return !operator == (other);
}


void a() {
   Op op = &X::operator ==;
   if (!A)
      if (op != &X::operator ==)
	 A(1) = a;
   if (!A) {
      if (op != &X::operator ==)
	 A(1) = a;
   }
}

void *operator new (std::size_t) throw(std::bad_alloc);
void *operator new[] (std::size_t) throw(std::bad_alloc);
void operator delete (void *) throw();
void operator delete[] (void *) throw();
