Gleichnamige Typen in verschiedenen Namespaces



  • Hi 🙂

    Ich kann es gerade nicht testen, aber es wäre wichtig zu wissen ...

    angenommen:

    typedef int footype;
    
    namespace bar
    {
        typedef float footype;
        typedef footype bartype;
    }
    

    Wäre bartype garantiert ein Alias für float, oder?

    Grüße 🙂



  • Ja. Wenn dein Ausdruck allerdings komplizierter wird, musst du mit ADL aufpassen.



  • Hmm, ja, Danke. 🙂

    Nach welchen Kriterien wird da eigentlich entschieden?

    Angenommen auf den ersten Code folgt:

    using namespace bar;
    
    footype var1;
    

    Wird der Compiler das als int oder float deklarieren?



  • In diesem Fall wäre es ein mehrdeutiges Symbol. Dann musst du explizit qualifizieren:

    bar::footype var1;    // float
    ::footype var2;    // int
    

    Edit: Ne Übersicht über die Lookup-Regeln weiß ich auf Anhieb nicht. Es gibt so viele, dass du wohl kaum ne komplette Übersicht zu Überladungen mit Namespaces, Templates, Koenig-Lookup, Two Phase Name Lookup etc. findest außer den Standard.



  • Danke, danke.

    Ich müsste das mal testen, da bei mir ::footype exakt bar::footype entspricht 🙂

    (Mein bibliotheksinterner Name für Prozessids ist pid_t, jetzt beim Porten nach Linux sehe ich dass der Standardtyp auch pid_t heißt ... um konsequent zu sein muss der Typ auf jeden Fall definiert werden :>



  • Wie wäre es mit sowas?

    namespace Meiner {
    
    #if defined(_WIN32)
        typedef DWORD pid_t;
    #elif defined(__linux__)
        using ::pid_t;
    #else
        #error Geht net
    #endif
    
    } // namespace Meiner
    


  • Stimmt, using ... darauf bin ich nicht gekommen! 🙂
    Danke 😉


Log in to reply