Vector von Iteratoren in Template



  • Hi zusammen

    folgender Quellcode:

        template <class T>
        class TestTemplate
        {
        private:
            void doStuff()
            {
                // ich möchte hier einige Iteratoren auf Elemente in 'Data' speichern
                std::vector<std::vector<std::pair<T,bool>>::iterator> VectorOfIterators;
            }
            std::vector<std::pair<T,bool>> Data;
        };
    

    Ich habe im Klassentemplate einen vector 'Data' der den Typ T und zusätzlich noch ein bool als Status beinhaltet.
    Nun möchte ich in der Methode "doStuff" einige Iteratoren auf Elemente von "Data" speichern, bekomme es aber nicht kompiliert. Vielleicht habe ich was übersehen oder Wissenslücken 😉

    Die Meldung ist (Zeile 8):
    error: type/value mismatch at argument 1 in template parameter list for 'template<class _Tp, class _Alloc> class std::vector'

    Vielleicht hat jemand eine Idee? Ich stehe gerade mächtig auf dem Schlauch, vermute aber dass es etwas total triviales ist... 😆



  • Dir fehlt ein typename. Sagt dir dein Compiler das nicht?

    <source>:10:25: error: template argument for template type parameter must be a type; did you forget 'typename'?
                std::vector<std::vector<std::pair<T,bool>>::iterator> VectorOfIterators;
                            ^
                            typename 
    


  • @wob sagte in Vector von Iteratoren in Template:

    <source>:10:25: error: template argument for template type parameter must be a type; did you forget 'typename'?
                std::vector<std::vector<std::pair<T,bool>>::iterator> VectorOfIterators;
                            ^
                            typename 
    

    Ist das Clang? Ich hätte wetten können GCC produziert auch so ne schöne Meldung, aber stattdessen kommt die selbe Meldung die @It0101 bekommen hat (GCC 11.2 mit -Wall):

    error: type/value mismatch at argument 1 in template parameter list for 'template<class _Tp, class _Alloc> class std::vector'
       11 |             std::vector<std::vector<std::pair<T,bool>>::iterator> VectorOfIterators;
          |                                                                 ^
    note:   expected a type, got 'std::vector<std::pair<T, bool> >::iterator'
    error: template argument 2 is invalid
    

    "expected a type" ist natürlich ein Hinweis, wenn man weiss wie sich das mit den dependent types und typename verhält. Dein Compiler produziert aber eine wesentlich hübschere Meldung 😉



  • Das hat der Compiler tatsächlich angezeigt, aber ich habe es wohl irgendwie überlesen 🙂

    Danke dir 🙂 Compiler ist bei mir ein aktueller MinGW.



  • @It0101 sagte in Vector von Iteratoren in Template:

    Compiler ist bei mir ein aktueller MinGW.

    Ja, das ist GCC. MinGW ist ja nur die "C Runtime" plus Windows-API ... wobei auch Clang-MinGW ginge, weiss aber nicht, obs das schon fertig gibt oder ob man sich das selbst bauen muss. Clang hat auf jeden Fall den Ruf so schöne Messages zu produzieren 😉



  • @It0101 sagte in Vector von Iteratoren in Template:

    Das hat der Compiler tatsächlich angezeigt, aber ich habe es wohl irgendwie überlesen 🙂

    Danke dir 🙂 Compiler ist bei mir ein aktueller MinGW.

    Welche mingw Distribution ist das? Gibt es da schon welche basierend auf dem gcc 11.2?



  • @VLSI_Akiko sagte in Vector von Iteratoren in Template:

    @It0101 sagte in Vector von Iteratoren in Template:

    Das hat der Compiler tatsächlich angezeigt, aber ich habe es wohl irgendwie überlesen 🙂

    Danke dir 🙂 Compiler ist bei mir ein aktueller MinGW.

    Welche mingw Distribution ist das? Gibt es da schon welche basierend auf dem gcc 11.2?

    Es ist ein MinGW 8.1 64bit. Derjenige welcher mit dem QTCreator mitgeliefert wird.



  • @VLSI_Akiko sagte in Vector von Iteratoren in Template:

    Welche mingw Distribution ist das? Gibt es da schon welche basierend auf dem gcc 11.2?

    Ich habe gerade die letzten Tage einen selbst gebaut. Glaube nicht, dass es da schon was "offizielles" gibt. Wenn du extrem scharf drauf bist, kann ich dir oder anderen Interessierten die Build Skripte zukommen lassen. Ist alles noch ne Baustelle und arg WIP, aber es sind eine handvoll Bash-Skripte die nötige Sourcen runterladen und das Ding in einem Docker Container hochziehen (neben Cross Compilern von Windows auf Linux mit musl libc - x86_64-linux-musl-g++.exe et al.).



  • @It0101 sagte in Vector von Iteratoren in Template:

    Es ist ein MinGW 8.1 64bit. Derjenige welcher mit dem QTCreator mitgeliefert wird.

    Wäre mir neu, dass Qt jemals einen MinGW ausgeliefert hat, der auf einem halbwegs aktuellen GCC basiert. 😁

    @Finnegan sagte in Vector von Iteratoren in Template:

    Ich habe gerade die letzten Tage einen selbst gebaut. Glaube nicht, dass es da schon was "offizielles" gibt. Wenn du extrem scharf drauf bist, kann ich dir oder anderen Interessierten die Build Skripte zukommen lassen. Ist alles noch ne Baustelle und arg WIP, aber es sind eine handvoll Bash-Skripte die nötige Sourcen runterladen und das Ding in einem Docker Container hochziehen (neben Cross Compilern von Windows auf Linux mit musl libc - x86_64-linux-musl-g++.exe et al.).

    Ich habe gelegentlich den Nuwen MinGW benutzt. War von einem MS Mitarbeiter, der da recht viel Arbeit reingesteckt hat. Aber irgendwie hat das von ca. 2 Jahren aufgehört. Öhm nein, Docker kommt mir nicht aufs System. (Warum nicht kann man mit einer Suchmaschine seiner Wahl herausfinden.) 😂



  • @VLSI_Akiko sagte in Vector von Iteratoren in Template:

    Ich habe gelegentlich den Nuwen MinGW benutzt. War von einem MS Mitarbeiter, der da recht viel Arbeit reingesteckt hat. Aber irgendwie hat das von ca. 2 Jahren aufgehört. Öhm nein, Docker kommt mir nicht aufs System. (Warum nicht kann man mit einer Suchmaschine seiner Wahl herausfinden.) 😂

    Bin jetzt auch kein totaler Fan von Docker, aber es ist schon ein praktisches Werkzeug um das Build-System in einen wohldefinierten Ausgangszustand zu bringen und es vom Rest des Rechners abzukoppeln (damit kann ich gleich eine ganze Reihe Fehlerquellen eliminieren). Ich weiss nicht, ob du schonmal GCC gebaut hast, aber deren Moloch von Autotools-Build ist wie mit Nitroglyzerin-Fläschchen zu jonglieren. GCC selbst bauen ist immer ein Abenteuer und es wundert mich nicht, dass der MS-Kollege da viel Arbeit reingesteckt hat.... ach ich seh grad, das ist Stephan T. Lavavej. Ja, der ist mir ein Begriff - nicht zuletzt auch von diversen Vorträgen zu C++ - und mir war auch dessen GCC-Build bekannt.

    Meine Variante orientiert sich an den MSYS2- und TDM-GCC Builds und integriert etliche von deren Patches. Letztendlich ist das aber nur mein persönlicher Build und ich habe auch nicht wirklich vor, Support dafür zu garantieren. Ich teile aber bei Interesse gerne meine bisherige Arbeit daran ... es ist nämlich schon in ganz schönes Gefummel, das ans Laufen zu bekommen. Clang baut sich da wesentlich angenehmer 😉



  • @Finnegan sagte in Vector von Iteratoren in Template:

    Ich weiss nicht, ob du schonmal GCC gebaut hast, aber deren Moloch von Autotools-Build ist wie mit Nitroglyzerin-Fläschchen zu jonglieren. GCC selbst bauen ist immer ein Abenteuer und es wundert mich nicht, dass der MS-Kollege da viel Arbeit reingesteckt hat.... ach ich seh grad, das ist Stephan T. Lavavej. Ja, der ist mir ein Begriff - nicht zuletzt auch von diversen Vorträgen zu C++ - und mir war auch dessen GCC-Build bekannt.

    Ich bin ehemaliger Distributionsbauer (SuSE) und betreibe bis heute Integration mit Yocto, OpenADK, buildroot, crosstool-ng und gelegentlich auch mit meinen eigenen cross toolchain Scripten um neue Features zu testen oder eben weil ich eine Toolchain komplett basierend auf MUSL brauche (Statisch linken mit MUSL erzeugt einfach deutlich kleinere Binaries.) Öhm, also ja, es ist Bestandteil meines Jobs. Allerdings muss ich gestehen, dass ich nicht wirklich weiß, wie das unter Windows aussieht. Ich meine schon allein dass GCCs Buildsystem auf den automake Tools basiert, dürfte für Windows die Hölle sein.

    @Finnegan sagte in Vector von Iteratoren in Template:

    Ich teile aber bei Interesse gerne meine bisherige Arbeit daran ... es ist nämlich schon in ganz schönes Gefummel, das ans Laufen zu bekommen. Clang baut sich da wesentlich angenehmer

    Hrhr, dann baue mal dein eigenes Linux komplett durch. Da geht der Spaß erst so richtig los. Ich habe das für einen MC68060 basierten Amiga gemacht. Man sieht nicht alle Tage auf einem Amiga ein Linux mit einem gcc wo C++20 geht. Und nein, das macht absolut kein Spaß, aber es ist möglich. 😂



  • @VLSI_Akiko sagte in Vector von Iteratoren in Template:

    Allerdings muss ich gestehen, dass ich nicht wirklich weiß, wie das unter Windows aussieht. Ich meine schon allein dass GCCs Buildsystem auf den automake Tools basiert, dürfte für Windows die Hölle sein.

    Daher auch der Docker-Container, in dem ein Debian 11 installiert wird und dann GCC+MinGW für Windows als Canadian Cross gebaut werden. Meine vorherigen GCC habe ich tatsächlich noch unter Windows mit MSYS2 gebaut. Das geht tatsächlich mit erstaunlich wenig Macken, die durch das Build-Setup zutage treten.

    Windows hat aber ein extrem grosses Problem, wenn es um solche Builds geht: Das System ist arschlahm im Umgang mit vielen kleinen Dateien und beim Erstellen neuer Prozesse - das sind genau die Dinge, die man für solche Builds benötigt. Dass sich der Echtzeitschutz des Windows Defender immer nach ner Weile wieder einschaltet und dann anfängt, jede böse .o-Datei zu scannen macht die Sache auch nicht wirklich besser. Du würdest wahrscheinlich vom Glauben abfallen, wenn du sehen würdest, wie sich Windows allein durch so ein configure-Skript quält. In der Zeit hat der Docker-Container den GCC schon fast fertig gebaut 😉

    Das ist letztendlich auch der Grund warum ich die Mühe mit dem Canadian Cross auf mich genommen hab, der ja nochmal ne Ecke fummeliger ist. Jetzt kann ich sogar -O3 -flto und wegen dem Canadian alles doppelt bauen (einmal für Linux-"build" und einmal für Windows-"host") und bin trotzdem schneller fertig als vorher^^

    Edit:

    @VLSI_Akiko sagte in Vector von Iteratoren in Template:

    Ich bin ehemaliger Distributionsbauer (SuSE) und betreibe bis heute Integration mit Yocto, OpenADK, buildroot, crosstool-ng und gelegentlich auch mit meinen eigenen cross toolchain Scripten um neue Features zu testen oder eben weil ich eine Toolchain komplett basierend auf MUSL brauche (Statisch linken mit MUSL erzeugt einfach deutlich kleinere Binaries.) Öhm, also ja, es ist Bestandteil meines Jobs.

    Das ist auf jeden Fall interessant. Mit buildroot kam ich via OpenWRT in Berührung als ich mir mal nen Firmware Image und ein extra Paket für meinen Router gebaut habe. Das habe ich letztendlich auch in einem Docker-Container gemacht. Der OpenWRT-Buildprozess ist da schon etwas pingelig bezüüglich des Build-Systems gewesen. WSL2 und Alpine Linux mochte der der nicht wirklich. Daher einen Debian-Container genommen für den Build. Die kann man schön per Skript nur für den Build aufsetzen und dann wieder wegwerfen. Für Server-Deinste und sowas setze Docker nicht ein, aber für sowas finde ich das genau richtig.

    Und crosstool-ng? Kann das nicht eh schon sowas wie nen MinGW für Windows bauen? Hab mir das nie wirlich angesehen ... oder ist das nur um Crosscompiler für die native Maschine zu bauen?

    Dass du Musl erwähnst find ich auch witzig. Das ist einer der Gründe, weshalb das bei meinem Build dabei ist. Ich hätte gerne für Windows nen Compiler für generische Linux-Targets zu Testen. Da hat sich Musl als libc angeboten, da kann man einfach mal ne statisch gelinkte Binary auf den Linux-Rechner schieben um sie dort zu testen und habe letztendlich nur eine Abhängigkeit vom Linux-Kernel.


Anmelden zum Antworten