using data_type in namespace und operator<< ueberladen



  • hallo leute

    ich hab z.b. einen datentype datum, der ein einfaches struct ist:

    struct datum
    {
       short year, month, day;
    };
    

    nun hab ich mehrere namespaces wo ich auch wieder den datentyp datum brauche:

    namespace ns1
    {
       using datum = ::datum;
       auto operator<<(std::ostream &out, datum &d) -> std::ostream&;
    }
    
    namespace ns2
    {
       using datum = ::datum;
       auto operator<<(std::ostream &out, datum &d) -> std::ostream&;
    }
    

    nun kann ich aber nicht mehr im globalen namespace den operator<< nutzen.
    mit angabe des namespaces geht es natuerlich.
    wie kann ich nun die den beiden namespaces einen datentyp datum definieren, damit ich ihn logisch benutzen kann ?
    muss ich da wirklich dann von ::datum erben ? oder gibt es da noch eine andere moeglichkeit ?
    bei so einfachen datentypen wie datum geht es mit dem ableiten ja noch. aber was ist wenn ich eine klasse mit recht umfangreichen constructoren/operatoren habe ?

    Meep Meep



  • Mir ist ehrlich noch nicht so ganz klar, was eigentlich dein Ziel ist. Kannst du mal irgendwie ein Beispiel geben, wozu das gut sein soll? Wieso ist der operator<< nicht in demselben Namespace wie das struct datum?

    "Argument dependent lookup" ist dir sicher bekannt, oder?

    aber was ist wenn ich eine klasse mit recht umfangreichen constructoren/operatoren habe ?

    Was soll dann sein? Verstehe die Problematik leider nicht.



  • wob schrieb:

    Mir ist ehrlich noch nicht so ganz klar, was eigentlich dein Ziel ist. Kannst du mal irgendwie ein Beispiel geben, wozu das gut sein soll? Wieso ist der operator<< nicht in demselben Namespace wie das struct datum?

    "Argument dependent lookup" ist dir sicher bekannt, oder?

    Ja schon.

    kleines beispiel:

    struct my_value
    {
       int value;
    };
    
    inline auto operator<<(std::ostream &out, const my_value &val) -> std::ostream&
    {
       out << '|' << val.value << '|';
    
       return out;
    }
    
    namespace n1
    {
    
    using n1_value = ::my_value;
    
    inline auto operator<<(std::ostream &out, const n1_value &val) -> std::ostream&
    {
       out << '<' << val.value << '>';
    
       return out;
    }
    
    }
    
    namespace n2
    {
    
    using n2_value = ::my_value;
    
    inline auto operator<<(std::ostream &out, const n2_value &val) -> std::ostream&
    {
       out << '>' << val.value << '<';
    
       return out;
    }
    
    }
    
    auto main(int, const char**) -> int
    {
       my_value v1;
       n1::n1_value v2;
       n2::n2_value v3;
    
       std::cout << v1 << v2 << v3;
       return 0;
    }
    

    Ergebnis:

    |-858993460||-858993460||-858993460|
    


  • Vielleicht die einfache Antwort:

    Wenn du im Standard nach using suchst, findest du, dass es dort "alias-declaration" heißt. Insbesondere definierst du mit "using" keinen neuen Typ ("In particular, it does not define a new type."), d.h. dein n1_value und n2_value sind keine unabhängigen neuen Typen.

    Ein Namespace ist nicht das richtige Mittel für das, was du versuchst.

    Es gibt ja auch bei den iostreams nicht die namespaces scientific, fixed usw., in denen jeweils << für doubles anders implementiert ist.



  • die drei datums klassen mit den 2 namespaces sind von jemandem anderes.
    frueher hatte er dafuer jeweils eine eigene klasse im globalen und in den beiden namespaces. nun hat er den code geaendert und in den namespaces sind nur noch die aliase auf die dautmsklasse im globalen namespace. nun funktionieren all meine operator-ueberladungen nicht mehr. also bin ich am ueberlegen wie ich das mache, das ich so wenig wie moeglich aenderungen an meinem code vornehmen muss.



  • 3 Datumsklassen in 2 Namespaces? Klingt für mich nach "bisherige Datumsklassen wegschmeißen und die von Howard Hinnant nehmen" -> https://github.com/HowardHinnant/date/blob/master/date.h
    OK, hilft dir hier jetzt wohl nicht weiter.


Anmelden zum Antworten