std::swap spezialisieren



  • Die Frage ist mir ein bisschen peinlich: aber wie spezialisiert man std::swap fuer einen eigenen container?

    mein versuch (unter anderem):

    template<typename T>
    inline void std::swap(cppgi::util::slist<T>& a, cppgi::util::slist<T>& b)
    {
        a.swap(b);
    }
    

    aber das will nicht so ganz. Borland meint

    Error E2038 c:\code\cpp\cppgi\util/slist.hpp 251: Cannot declare or define 'std:
    :swap(cppgi::util::slist<T> &,cppgi::util::slist<T> &)' here

    der code drum herum ist richtig, denn wenn ich das swap auskommentiere kompiliert es ohne probleme...



  • also folgendes Beispiel kompiliert bei mir

    template<typename T> struct bar { };
    
    template<class T>
    inline void std::swap(bar<T> &lhs,bar<T> &rhs) {
    }
    
    int main() { }
    

    ohne Probleme (GCC 3.3.1)



  • Müsste man nicht eigentlich so schreiben:

    namespace std {
      template <typename T>
      inline void swap ...
    }
    

    ?



  • Bashar schrieb:

    Müsste man nicht eigentlich so schreiben:

    namespace std {
      template <typename T>
      inline void swap ...
    }
    

    ?

    Ja. So ist es.

    Das ganze ist übrigens zwar eine Spezialisierung, aber erreicht durch eine Überladung, nicht durch eine Template-Spezialisierung.

    Nur so um etwas Verwirrung zu stiften 🙂



  • ich dachte man darf den namespace std nicht mehr bearbeiten



  • denker schrieb:

    ich dachte man darf den namespace std nicht mehr bearbeiten

    Da dachtest du fast richtig. Der Namespace std ist grundsätzlich geschlossen. Vorhandene Elemente dürfen aber nach gewissen Regeln spezialisiert werden.

    Und das Spezialisieren von std::swap ist erlaubt.


Anmelden zum Antworten