namespace Space { struct Klass { Klass(int i) {} Klass() {} }; } namespace AnotherSpace { class Another {}; } namespace Space { using namespace AnotherSpace; enum Enu { En1, En2, En3 }; template struct NotXYZ {}; template class XYZ { NotXYZ *m_int; T m_t; NotXYZ m_notxyz; public: operator NotXYZ*() const { return m_int; } operator XYZ*() const { return 0; } operator Another() const { Another an; return an; } void templateT(T i) {} void templateNotXYZ(NotXYZ i) {} void templateXYZ(XYZ i) {} operator T() { return m_t; } operator NotXYZ() const { return m_notxyz; } operator XYZ() const { XYZ xyz = XYZ(); return xyz; } }; } namespace Space { // non-templated class using itself in method and operator class ABC { public: void method(ABC a) const {} void method(Klass k) const {} operator ABC() const { ABC a; return a; } operator Klass() const { Klass k; return k; } }; }