template in namespace



  • camper schrieb:

    Konrad Rudolph schrieb:

    camper schrieb:

    Was hat inline bei Funktionstemplates mit der ODR zu tun?

    Es geht nicht um die Funktionstemplates sondern um die Tatsache, dass die Definition im Header steht und der Header ja an mehrern Stellen eingebunden werden kann.

    Dann verstehe ich nicht, was du mit

    Klar, es sollte trotzdem 'inline' sein wegen der ODR.

    sagen willst.

    Und ich verstehe wiederum nicht, was Du daran nicht verstehst. Wenn die Funktion nicht 'inline' ist und Du sie in mehrere Übersetzungseinheiten einbindest, knallt's.


  • Mod

    Konrad Rudolph schrieb:

    camper schrieb:

    Konrad Rudolph schrieb:

    camper schrieb:

    Was hat inline bei Funktionstemplates mit der ODR zu tun?

    Es geht nicht um die Funktionstemplates sondern um die Tatsache, dass die Definition im Header steht und der Header ja an mehrern Stellen eingebunden werden kann.

    Dann verstehe ich nicht, was du mit

    Klar, es sollte trotzdem 'inline' sein wegen der ODR.

    sagen willst.

    Und ich verstehe wiederum nicht, was Du daran nicht verstehst. Wenn die Funktion nicht 'inline' ist und Du sie in mehrere Übersetzungseinheiten einbindest, knallt's.

    Keineswegs.

    Templates dürfen in einem Programm mehrfach definiert werden, sofern jede Definition in einer anderen Übersetzungseinheit auftaucht (und noch ein paar zusätzliche Bedingungen erfüllt sind, die, ohne ins Detail zu gehen, darauf hinauslaufen, dass jede Definition die gleiche Bedeutung haben muss).

    Funktionen dürfen nicht mehrfach definiert werden.Eine Templatedefinition ist aber keine Funktionsdefinition. Eine Templatespezialierung des gleichen Templates darf in mehreren Übersetzungseinheiten mit den gleichen Templateparametern instantiiert werden ohne die ODR zu verletzen - welche Instanz benutzt wird bleibt unspezifiziert (sie müssen ja sowieso alle gleich sein).

    Eine explizite Spezialisierung eines Templates ist kein Template.

    Demzufolge darf die Definition einer expliziten Spezialisierung eines Funktionstemplates nur einmal erfolgen (weil es eine Funktionsdefinition ist) oder muss inline sein, wenn man diese Definition ebenfalls im Header durchführen will, weil sie logisch zur Templatedefinition gehört.



  • camper, Du hast natürlich mit Cruise-Missile-Genauigkeit auf meinen Fehler zugesteuert. 🙄 Klar. Danke.



  • camper schrieb:

    ...- welche Instanz benutzt wird bleibt unspezifiziert (sie müssen ja sowieso alle gleich sein)...

    Mal eine Frage aus Neugier: Stellt der Compiler/Linker das irgendwie sicher ? Und wenn ja: Wie wird das üblicherweise gemacht ?

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Mal eine Frage aus Neugier: Stellt der Compiler/Linker das irgendwie sicher ? Und wenn ja: Wie wird das üblicherweise gemacht ?

    Interessante Frage, die mich dazu verleitet hat, das ganze mal mit dem gcc 4.1 auszuprobieren. Folgende Quelltexte sind gegeben:

    // file1.cpp
    #include <iostream>
    
    extern void xy();
    
    template<typename T>
    T hallo()
    {
        return 3;
    }
    
    int main()
    {
        std::cout << hallo<int>() << std::endl;
        xy();
    }
    
    // file2.cpp
    #include <iostream>
    
    template<typename T>
    T hallo()
    {
        return 2;
    }
    
    void xy()
    {
        std::cout << hallo<int>() << std::endl;
    }
    

    Ausgabe ohne Inline-Expansion, wenn file1.o vor file2.o gelinkt wird: 3, 3
    Ausgabe ohne Inline-Expansion, wenn file2.o vor file1.o gelinkt wird: 2, 2
    Ausgabe mit Inline-Expansion: 3, 2

    Er stellt also offensichtlich garnichts (zuverlässig) sicher, sondern nimmt die erste Definition, die beim Linken auftaucht (wenn der Compiler nicht geinlined hat).



  • LordJaxom schrieb:

    Er stellt also offensichtlich garnichts (zuverlässig) sicher, sondern nimmt die erste Definition, die beim Linken auftaucht (wenn der Compiler nicht geinlined hat).

    sei froh, dass er das macht und dir nicht der himmel auf den kopf fällt.



  • queer_boy schrieb:

    sei froh, dass er das macht und dir nicht der himmel auf den kopf fällt.

    Mir ist egal, was er da macht, da ich sowas natürlich nicht mache 😃



  • queer_boy schrieb:

    LordJaxom schrieb:

    Er stellt also offensichtlich garnichts (zuverlässig) sicher, sondern nimmt die erste Definition, die beim Linken auftaucht (wenn der Compiler nicht geinlined hat).

    sei froh, dass er das macht und dir nicht der himmel auf den kopf fällt.

    Ich waere darueber nicht froh. Ich wuerd mich eher freuen wenn der Compiler/Linker sowas erkennt und mir nicht nur den Himmel auf den Kopf schmeisst sondern gleich auch noch einen kraeftigen tritt in den Hintern verpasst 😉



  • es könnte fast sein, dass hier das berühmt-berüchtigte "no diagnostics required" zuschlägt. habe hier nur gerade keinen standard zum reinschauen da.



  • unter dem Wikipedia-Artikel zur ODR steht

    Some violations of the ODR must be diagnosed by the compiler. Other violations, particularly those that span translation units, are not required to be diagnosed.

    also genau das "no diagnostics required" - ich evrmute dann wirds auch im standard so stehn 😉


Anmelden zum Antworten