Seltsamer Fehler beim verschachteltem Template



  • Hallo! 🤡

    Folgendes kurz und bündig ...

    template<typename T>
    class base
    {
    };
    
    template<typename T>
    class deri : public base<T>
    {
    public:
    	template<typename E>
    	void element() { }
    };
    
    template<typename T>
    void templateFunc()
    {
    	deri<T> d;
    	d.element<T>();
    }
    
    int main()
    {
    	templateFunc<float>();
    }
    

    erbibt:

    g++ test.cpp -o test
    test.cpp: In function »void templateFunc()«:
    test.cpp:17: Fehler: expected primary-expression before »>« token
    test.cpp:17: Fehler: expected primary-expression before »)« token

    Einzige mögliche Konstellation:

    template<typename T>
    void templateFunc()
    {
    	deri<float> d;
    	d.element<T>();
    }
    

    Was aber absolut inakzeptabel ist.

    Kann mir jemand erklären warum das passiert?

    Danke euch vielmals! 🕶



  • Merkwürdig, bei mir (VC++ Express 2008) geht dein grosser Beispielcode ohne Probleme. Ich sehe auch nichts...

    Könnte das eventuell ein Bug sein? Versuch doch mal, die Projektmappe neu zu erstellen...



  • Nexus schrieb:

    Merkwürdig, bei mir (VC++ Express 2008) geht dein grosser Beispielcode ohne Probleme. Ich sehe auch nichts...

    Könnte das eventuell ein Bug sein? Versuch doch mal, die Projektmappe neu zu erstellen...

    Das hört sich aber mies an ...

    Ich hab gcc-4.1.2 und Linux 🙂 😞

    Projektmappen sind mir dementsprechend fremd ... 🙄


  • Mod

    d.template element<T>();
    


  • camper schrieb:

    d.template element<T>();
    

    Ich bin entzückt und Danke sehr ... aber warum muss man das so schreiben?! 😕 😮 😕


  • Mod

    Pigeon schrieb:

    camper schrieb:

    d.template element<T>();
    

    Ich bin entzückt und Danke sehr ... aber warum muss man das so schreiben?! 😕 😮 😕

    Weil element ein abhängiger Name ist. Ohne zu wissen, ob element ein Template ist oder nicht, kann man das folgende < nicht richtig interpretieren (operator< mit dem Ausruck d.element als linkem Operand oder eben der Beginn einer Templateargumentliste). In solchen Fällen nimmt der Compiler an, dass es sich nicht um ein Template handelt, wenn das Schlüsselwort template nicht verwendet wird.



  • Wieso führt das dann im Visual C++ 2008 Express zu keiner Fehlermeldung? Erkennt der Compiler "element" als Template?


  • Mod

    Nexus schrieb:

    Wieso führt das dann im Visual C++ 2008 Express zu keiner Fehlermeldung? Erkennt der Compiler "element" als Template?

    Visual C++ ist traditionell ziemlich lax im Umgang mit template (und typename, das eine vergleichbare Rolle hat) für diesen Zweck. Das ist nicht standardkonform (das template muss dort stehen) und wird wahrscheinlich nur aus Kompatibilitätsgründen so beibehalten - jedenfalls führen Probleme hier schnell zu einem ICE. Der Compiler kann nicht "erkennen", dass es sich um ein Template handelt, höchtens "vermuten" - und diese Vermutung kann fehlschlagen. z.B. könntest du deri so spezialisieren (irgendwann später, aber bevor irgendeine Spezialisierung von templateFunc diese benutzen würde), dass element für diese Spezialisierung gerade mal kein Template ist.



  • mit ICE meint er Internal Compiler Error


Log in to reply