Element-Typen eines Template-Arguments



  • Hallo Forum!
    Ich habe ein Problem mit Templates und breche es nun einmal auf die hier herunter, sodass die Typen nicht zu kompliziert werden:

    template<class Container = std::vector>
    class Test
    {
    private:
      Container::iterator i;
    };
    

    Allein das sorgt bei meinem C++-Compiler für einige Fehler.
    Ist es denn nicht möglich auf Element-Typen eines Template-Arguments zuzugreifen? Oder muss man die vielleicht irgendwie deklarieren?

    Grr, ich will Zugriff auf diese Typen haben! 😃

    Ich hoffe mir kann jemand helfen.
    Danke...
    The User



  • Weil du dein Problem so schön gekürtzt hast, gibts auch gleich eine Lösung. 😉

    template<class Container = std::vector>
    class Test
    {
    private:
      typename Container::iterator i;
    };
    

    Typename, weil der Compiler nicht wissen kann, was Container sein soll. Also musst du es ihm sagen. 😉

    btw:
    Das nächste mal die Fehlermeldung posten..



  • drakon schrieb:

    Typename, weil der Compiler nicht wissen kann, was iterator sein soll. Also musst du es ihm sagen.

    😉



  • KasF schrieb:

    drakon schrieb:

    Typename, weil der Compiler nicht wissen kann, was iterator sein soll. Also musst du es ihm sagen.

    😉

    Huch. Hast Recht. Bin gerade ein wenig verwirrt. Habe einen richtig geilen Job gefunden. 😉



  • Danke sehr!
    C++ enttäuscht mich nie, nur bei Templates muss man manchmal nachfragen. 😃
    (Java dagegen enttäuscht mich sehr oft... 😡 )
    Ich hatte schon befürchtet, das ginge nicht. typename kannte ich garnicht in diesem Zusammenhang, hatte nur typedef und using bei Vererbung ausprobiert.
    Nochmal vielmals danke!

    Viele liebe Grüße
    The User

    Edit:
    Das Prinzip ist so oder so klar geworden, aber damit sich keiner wundert, dass das mit dem std::vector nicht geht: std::vector ist ja ein Template, also für das Beispiel entweder std::vector<int> oder template<typename T, template<typename, typename> class = std::vector> nehmen. 😉


Anmelden zum Antworten