[gelöst] std::swap mit verschiednene Typen möglich?



  • Ich hab folgendes Szenario und mscv liefert mir Fehlermeldungen

    long ze[5];
    int parID;
    
    /*...*/
    //ze[4] und parID vertauschen - wie?
    std::swap(ze[4],parID);//<---
    
    [...]error C2782: 'void std::swap(_Ty &,_Ty &)' : template parameter '_Ty' is ambiguous
            C:\programme\VisualStudio8\VC\INCLUDE\utility(16) : see declaration of 'std::swap'
            could be 'int'
            or 'long'
    

    Verständlich, also explizit angeben welchen swap ich will:

    std::swap<long>(ze[4],parID);
    
    error C2665: 'std::swap' : none of the 2 overloads could convert all the argument types
            C:\programme\VisualStudio8\VC\INCLUDE\utility(16): could be 'void std::swap<long>(_Ty &,_Ty &)'
            with
            [
                _Ty=long
            ]
            C:\programme\VisualStudio8\VC\INCLUDE\vector(1482): or 'void std::swap<long>(std::_Vb_reference<_MycontTy>,std::_Vb_reference<_MycontTy>)'
            with
            [
                _MycontTy=long
            ]
            while trying to match the argument list '(long, int)'
    

    Wie kann ichs lösen?



  • casten

    std::swap(static_cast<long>(ze[4], parID);
    

    wobei pass da schwer auf, es ist nicht ohne grund möglich dass man 2 verschiedene typen nicht untereinander tauschen kann

    nimm lieber 2mal den gleichen typ, also:

    int ze[5];
    int parID;
    // oder
    long ze[5];
    long parID;
    

    es bringt an sich eh nichts verschiedene typen zu benutzen weil int und long auf modernen compilern gleich sind



  • Wie willst du denn einen int an eine long& binden, mmh? 🙂 Das geht by design nicht. (der mit dem Casten war lustig 🤡)

    Kopier den int in einen long um, dann geht's auch mit swap. Aber wenn du das schon machst, kannst du auch gleich händisch tauschen. 😉



  • Cast ging natürlich auch nicht, aber ist ja auch klar, da beim Tausch a<->b sowohl a nach b als auch b nach a konvertiert werden muss. Ich hab dann parID zum long gemacht (war gottseidank ne lokale variable).

    Skym0sh0 schrieb:

    es bringt an sich eh nichts verschiedene typen zu benutzen weil int und long auf modernen compilern gleich sind

    Es sind und bleiben verschiedene Typen, auch wenn auf vielen aktuellen Systemen beide die gleiche Größe und Wertebereich haben.

    Da ich nur am bugfixen bin in historisch gewachsenem Code hatte ich nicht unbedingt vor, sämtliche Variablendeklarationen von long auf int (oder andersrum) zu ändern.

    Danke für die Tips...


Anmelden zum Antworten