
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();
