namespace x { namespace Internal { template < class T > class RefCntPtr { public: T *operator->() const; T *get() const; }; template < class T > inline T * RefCntPtr < T >::get() const {} } class iter { public: class Internal; x::Internal::RefCntPtr < Internal > internal; }; bool operator == (const x::iter &a, const x::iter &b) { return a.internal.get() == b.internal.get(); } } bool equals(x::iter const *self, x::iter const &other) { return *self == other; } bool f() { x::iter * arg1, *arg2; bool result; try { result = equals((x::iter const *)arg1, (x::iter const &)*arg2); } catch (...) {} return result; }