Templates - "Abhängiger Name ist kein Typ"



  • asddgj schrieb:

    Hallo,

    ich habe ein Problem mit Templates.

    Kurz zu meinem theoretischen Problem:

    Ich habe eine Template Klasse, die bis auf einen Parameter nur konstante Parameter enthalten soll.

    Beispiel:

    std::map<std::string, T> mit T als Template-Parameter
    

    Da es keine Template-Typedefs gibt, helfe ich mir mit einer Zwischen-Struktur:

    template<typename T>
    struct StringMap {
      typedef std::map<std::string, T> Type;
    };
    

    Soweit funktioniert das auch einwandfrei, über StringMap<int>::Type kann ich darauf zugreifen.

    Jetzt geht's aber weiter.

    Ich habe eine andere Klasse, die eine Methode besitzt, die eben eine std::map<std::string, T> zurückgeben soll, allerdings über die Hilfsstruktur (damit es übersichtlicher ist).

    Das sieht wie folgt aus (als Beispiel):

    template<typename T>
    class AndereKlasse {
    public:
      StringMap<T>::Type* getStringMap(int i) {
        // ...
      }
    };
    

    Das Problem ist: In der Zeile StringMap<T>::Type* getStringMap(int i) beschwert sich mein Compiler darüber: "warning C4346: 'StringMap<T>::Type': Abhängiger Name ist kein Typ", error C2143: Syntaxfehler: Es fehlt ';' vor '*' etc.

    Das Merkwürdige ist: Im Funktionsrumpf kann ich Variablen von dem Typen deklarieren etc., nur als Rückgabetyp wird es nicht anerkannt?

    Meine Frage: wieso nicht?

    Weil dein Compiler spinnt!

    Probier das mal mit einem aktuellen g++.



  • Nein, der Compiler spinnt nicht! Das ist Standard-konform! Woher soll er das auch wissen? Ist ja ein Template im Template. Das kann der nicht auflösen, da muß man halt mal typename davor schreiben.



  • MS-Bashing sollte man nur dann machen, wenn man sich seiner Vorurteile auch sicher ist. 🙄 Sonst wirds peinlich.



  • Strolch schrieb:

    StringMap<T>::Type ist für den Compiler kein Typ, du mußt noch typename davor schreiben. Weil er denkt, das Type schon eine Variable ist.
    Kann man auch im Scott Meyers nachlesen. 😉

    Danke, hat geholfen 😃



  • Strolch schrieb:

    Nein, der Compiler spinnt nicht! Das ist Standard-konform! Woher soll er das auch wissen? Ist ja ein Template im Template. Das kann der nicht auflösen, da muß man halt mal typename davor schreiben.

    Du lese könne?

    Der MSVC2008 erlaubt es an einigen Stellen, das 'typename' wegzulassen wo es
    erforderlich ist!



  • bladerunner10 schrieb:

    Strolch schrieb:

    Nein, der Compiler spinnt nicht! Das ist Standard-konform! Woher soll er das auch wissen? Ist ja ein Template im Template. Das kann der nicht auflösen, da muß man halt mal typename davor schreiben.

    Du lese könne?

    Der MSVC2008 erlaubt es an einigen Stellen, das 'typename' wegzulassen wo es
    erforderlich ist!

    Blub! Im gegensatz zu dir, habe ich eine Lösung (die anscheinend geholfen hat) geliefert.
    Und weiterhin, was hat das weglassen können, mit einem hinschreiben müssen zutun???
    Compiler wechseln... haha! Dabei braucht man nur typename hinschreiben. Wenn in deinem Badezimmer die Glühbirne nicht angeht, wechselst du anscheinend die ganze Wohnung, oder wie?



  • Strolch schrieb:

    bladerunner10 schrieb:

    Strolch schrieb:

    Nein, der Compiler spinnt nicht! Das ist Standard-konform! Woher soll er das auch wissen? Ist ja ein Template im Template. Das kann der nicht auflösen, da muß man halt mal typename davor schreiben.

    Du lese könne?

    Der MSVC2008 erlaubt es an einigen Stellen, das 'typename' wegzulassen wo es
    erforderlich ist!

    Blub! Im gegensatz zu dir, habe ich eine Lösung (die anscheinend geholfen hat) geliefert.

    Genau. Er hat jetzt Code, der von einem Standard-konformeren Compiler nicht mehr akzeptiert wird. Super!

    Strolch schrieb:

    Und weiterhin, was hat das weglassen können, mit einem hinschreiben müssen zutun???

    Der OP wunderte sich, daß er eben an enigen Stellen diesen Fehler nicht bekam.

    Strolch schrieb:

    Compiler wechseln... haha! Dabei braucht man nur typename hinschreiben. Wenn in deinem Badezimmer die Glühbirne nicht angeht, wechselst du anscheinend die ganze Wohnung, oder wie?

    Offensichtlich kann es nicht so verkehrt sein, seinen Kot mal mit einem
    anderen Compiler zu übersetzen.

    (Ach ja: Wir haben nur Kerzen...)

    EDIT: Ansonsten ist es natürlich absolut richtig, an den ensprechenden Stellen ein 'typename' einzufügen!



  • bladerunner10 schrieb:

    Genau. Er hat jetzt Code, der von einem Standard-konformeren Compiler nicht mehr akzeptiert wird. Super!

    Warum ist deshalb die Lösung falsch? Besser wäre natürlich ein ergänzender Kommentar gewesen "dort, wo Dein Compiler nicht meckert, fehlt aber trotzdem ebenfalls typename".

    Ich muss übrigens zugeben, dass nicht nur Strolch Deine Aussage missverstanden hat. Im Übrigen braucht Ihr Euch deshalb nicht an die Gurgel zu gehen 😃

    EDIT: Ansonsten ist es natürlich absolut richtig, an den ensprechenden Stellen ein 'typename' einzufügen!

    Eben!



  • Genau. Er hat jetzt Code, der von einem Standard-konformeren Compiler nicht mehr akzeptiert wird. Super!

    Klar, er war ja vorher standard-konform. Wie konnte ich nur vergessen, das er jetzt nicht mehr akzeptiert wird. Lief ja vorher ohne typename ganz sicherlich besser als im g++?!
    Oder wie passt das:

    Ansonsten ist es natürlich absolut richtig, an den ensprechenden Stellen ein 'typename' einzufügen!

    Und mir dann unterstellen, das ich den Code jetzt unkonformer/unrichtiger gemacht habe. LOL! Pass lieber auf deine Wortwahl auf!
    Hätteste mal ein paar ausführliche Sätze geschrieben, anstatt nur "Dein Compiler spinnt!", hätten wir alle was davon gehabt. Jetzt brauchste auch nicht mehr den Schlauberger raushängen lassen.



  • @bladerunner10
    Vielleicht solltest du dich etwas genauer ausdrücken. Deine Kommentare hierzu sind einfach Mist. Ich gehe davon aus dass du weisst worum es geht und wo das typename hingehört und wo nicht, aber das hilft niemandem wenn man deine Antworten nicht verstehen kann.

    Das "weil dein compiler spinnt" klingt für jmd. der es nicht besser weiss und daher hier fragt vermutlich danach dass du meinst die Warning bzw. der Fehler kommt nur daher weil der Compiler spinnt.

    Dann redet dich jmd. darauf an und du wirst patzig. Toll. 10 Punkte für guten Stil 👍


Anmelden zum Antworten