
//#define SHOW_BUG

#ifdef SHOW_BUG
namespace ns
{
#endif /* SHOW_BUG */

    class Outer
    {
    public:
        class Inner
        {
        public:
            Inner &operator ++();
            Inner operator ++(int);

        public:
            bool equal(Inner const &rhs) const;

        };

    public:
        Inner   begin();
        Inner   end();
    };

    inline bool operator ==(Outer::Inner const &lhs, Outer::Inner const &rhs)
    {
        return lhs.equal(rhs);
    }

    inline bool operator !=(Outer::Inner const &lhs, Outer::Inner const &rhs)
    {
        return !lhs.equal(rhs);
    }

#ifdef SHOW_BUG
}
#endif /* SHOW_BUG */

int main()
{
#ifdef SHOW_BUG
    using namespace ns;
#endif /* SHOW_BUG */

    Outer   outer;

    Outer::Inner    inner1  =   outer.begin();
    Outer::Inner    inner2  =   outer.end();

    if(inner1 == inner2)
    {}

    if(inner1 != inner2)
    {}

    return 0;
}
