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; } }; } #if defined(SWIG) %exception Space::ABC::operator ABC %{ #if defined(__clang__) // Workaround for: warning: conversion function converting 'Space::ABC' to itself will never be used result = *arg1; #else $action #endif %} #endif namespace Space { // non-templated class using itself in method and operator class ABC { public: void method(ABC a) const {} void method(Klass k) const {} #if !defined(__clang__) // Workaround for: warning: conversion function converting 'Space::ABC' to itself will never be used operator ABC() const { ABC a; return a; } #endif operator Klass() const { Klass k; return k; } }; }