[gelöst] In Abhaenigkeit von der Reihenfolge von Definitionen entweder Kompilerfehler oder eben nicht, Wieso?



  • Hi Forum,

    ich habe was ganz Kurioses. Der Quellcode

    struct foo{
        enum _bar_{bar};
    };
    
    template<typename t>
    void foo(){}
    
    int main(int argc, char** argv)
    {
        foo::bar;
        foo<void>();
        return 0;
    }
    

    bringt beim compilieren mit Visual C++ 2008 Express Edition folgenden Fehler

    main.cpp(6) : error C2904: 'foo': Name wird bereits für eine Vorlage im aktuellen Bereich verwendet
            main.cpp(1): Siehe Deklaration von 'foo'
    

    und ein g++ in Version 4.2.1 bringt ebenfalls einen Fehler.

    main.cpp: In function ‘int main(int, char**)’:
    main.cpp:10: error: ‘foo’ is not a class or namespace
    

    Wenn ich jedoch die struct foo nach dem Template definiere wird der Code von beiden Compilern anstandslos übersetzt.

    Wenn ich den Code mit einem g++ in Version > 4.4 teste, ist es die Reihenfolge hingegen egal und es wird immer ohne Beanstandungen übersetzt (vielleicht geht auch schon g++ ab Version 4.3, aber ich habe momentan keinen zur Hand um zu testen).

    Die Frage die sich aus dem Beispiel ergibt ist: Was sagt der Standard dazu?

    Wenn die Reihenfolge keine Rolle spielen sollte, würde ich dann mal annehmen, dass Visual C++ und ältere g++ hier nicht ganz konform sind.
    Sehe ich dies richtig?

    Gruß



  • Hi,

    Hat wirklich keiner eine Idee?

    Gruß



  • du kannst nicht auf jede Frage innerhalb von gut zwei Stunden eine Antwort erwarten - vor allem nicht mittags wo viele Leute anderes zu tun haben als im Forum zu lesen (z.B. arbeiten, essen,...)
    Also Geduld 😉


  • Mod

    mysterio schrieb:

    Die Frage die sich aus dem Beispiel ergibt ist: Was sagt der Standard dazu?

    ill-formed unabhängig von der Reihenfolge.

    14./5
    ...
    Except that a function template can be overloaded either by (non-template) functions with the same name or by other function templates with the same name (14.8.3), a template name declared in namespace scope or in class scope shall be unique in that scope.



  • @pumuckl: Ja, Du hast recht, aber sonst waren bei vielen Fragen die Antworten recht schnell da, oder zumindest eine Reaktion. Aber ich denke die Ungeduld kennt jeder, aber sorry dafür.

    @camper: Sollte also eindeutig sein. Mir ist dennoch nicht klar, warum der Code dann nicht immer zurückgewiesen wird. Warum spielt hier die Reihenfolge eine Rolle? Schließlich wird es durch das Tauschen ja auch nicht eindeutig.



  • mysterio schrieb:

    @camper: Sollte also eindeutig sein. Mir ist dennoch nicht klar, warum der Code dann nicht immer zurückgewiesen wird. Warum spielt hier die Reihenfolge eine Rolle? Schließlich wird es durch das Tauschen ja auch nicht eindeutig.

    Sieh das einfach als eine nette Geste, als ein Feature des einen oder anderen Compilers an.



  • Ja wahrscheinlich hast Du recht. Ich sollte mich also auf jeden Fall nicht darauf verlassen.

    Dank an alle für eure schnelle Hilfe



  • not a bug, a feature schrieb:

    Sieh das einfach als eine nette Geste, als ein Feature des einen oder anderen Compilers an.

    Ich würde es nicht als ein Feature betrachten, wenn etwas, was nach dem Standard schlichtweg falsch ist, durchgeht. Ein Feature wäre zusätzliche Funktionalität, die im Standard nicht drin steht. Hier handelt es sich um eine fehlende Erkennung von fehlerhaftem Code, der vom Standard nicht ohne Grund als fehlerhaft definiert wurde.





  • [quote="not a bug, a feature"]Ich sehe da weder einen class-scope noch einen namespace-scope.[quote] nennt sich auch global namescape...

    Hier ist es z.B. auch ok:
    http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.xlcpp101.cell.doc/language_ref/overloading_function_templates.html
    😕

    Da drehts sich um Überladung von funktionstemplates. Wo wir beim ersten Teil des von Camper zitierten Satzes sind, nämlich dem, wo die Ausnahmen angegeben werden, bei denen das tehrfache Vorkommen eines Templatenamens erlaubt ist.


Anmelden zum Antworten