Templateproblem



  • Das Template soll von main einen String übergeben bekommen. Dieser string soll als schleifenwiederholungsanzahl fungieren. Pro schleife wird dann der inkrementoperator in anspruch genommen um die gesamtbuchstabenlänge als des strings, als zahl auszugeben. Das ergebnis soll zu main zurückgegeben werden und der variablen "out" gespeichert werden.



  • 1. Du weißt schon, dass man die Länge eines strings auch einfacher bekommen kann?
    2. warum als template? für welche Typen soll das denn sonst noch sinnvoll angewendet werden?
    3. Die Zählvariable ist nicht vom Typ t, sondern size_t



  • kamelkacke schrieb:

    Pro schleife wird dann der inkrementoperator in anspruch genommen um die gesamtbuchstabenlänge des strings auszugeben.

    Du weichst aus. Der operator++ auf einem ganzen String ist nicht sinnvoll, was soll deiner Meinung nach passieren?



  • Nexus schrieb:

    Der operator++ auf einem ganzen String ist nicht sinnvoll, was soll deiner Meinung nach passieren?

    So, wie ich ihn inzwischen verstehe, will er die Buchstaben in dem übergebenen string zählen.



  • Hier etwas bearbeitet. Der compiler meckert nicht mehr wegen dem inkrementoperator sondern wegen der zeile 17.
    Wenn ich aus dem int ein string mache kommt die selbe meldung: no matching function for call to 'rechner( ..

    @felix der code hat keinen tieferen sinn. Ist nur übung

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    	template <class t>
    	t rechner (t test1, t test2) {
    		for (typename t :: iterator i=test1.begin (); i!=test1.end (); i++) {
    		test2++;
    		}
    		return test2;
    	}
    
    int main () {
    
    	string bs = "Hallo";
    	int anzahl = 0;
    	int out = rechner (bs, anzahl);
    	cout << out;
    }
    


  • Was soll t denn in deinem Beispiel sein? int oder std::string?

    Ehrlich egsagt, ich habe das Gefühl, dass Templates noch etwas zu hoch für dich sind.



  • t ist doch das, was ich übergebe oder? In diesem fall einmal string und einmal int. Und der int soll zurückgegeben werden.



  • kamelkacke schrieb:

    t ist doch das, was ich übergebe oder? In diesem fall einmal string und einmal int. Und der int soll zurückgegeben werden.

    t ist ein Typ. Der kann nicht sowohl int als auch string sein.

    Templates werden zur Kompilierzeit aufgelöst, d.h. anstelle von "t" wird der Typ der jeweiligen Instanziierung eingesetzt.


  • Mod

    template <typename T, typename T2>
        T2 rechner (T const& test1, T2 test2) 
        {
            return test2 += test1.size();
        }
    

    Halbwegs richtig.



  • Achso! Gibts denn sowas wie <class t, class x> ?


  • Mod

    kamelkacke schrieb:

    Achso! Gibts denn sowas wie <class t, class x> ?

    Ja, natürlich. typename und class sind in diesem Fall identisch.



  • Und auf dem weg gehts nicht?
    Die Fehlermeldung sagt cant convert x to x. Also braucht man nen übeadungskonstruktor?

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    	template <class t, class t2>
    	t rechner (t test1, t2 test2) {
    		for (typename t :: iterator i=test1.begin (); i!=test1.end (); i++) {
    		test2++;
    		}
    		return test2;
    	}
    int main () {
    
    	string bs = "Hallo";
    	int anzahl = 0;
    	int out = rechner (bs, anzahl);
    	cout << out;
    }
    


  • kamelkacke schrieb:

    Und auf dem weg gehts nicht?
    Die Fehlermeldung sagt cant convert x to x. Also braucht man nen übeadungskonstruktor?

    ...nein.
    Du gibst test2 zurück. Welcher Typ ist das? Und welcher Typ wird von deiner Funktion zurückgegeben?
    Templates sind definitiv noch zu hoch für dich.
    Schreib erstaml eine Funktion nur für std::string.



  • Pfff zeile 7 int statt t. Ansonsten ist alles richtig!!!! Danke leute



  • kamelkacke schrieb:

    Pfff zeile 7 int statt t. Ansonsten ist alles richtig!!!! Danke leute

    Nein, ist es nicht.
    Was ist, wenn t2 nicht kompatibel ist mit int?
    Und wieso muss die anzahl als Parameter übergeben werden, obwohl der Parameter gar nicht verwendet wird?
    Schreib es erstmal nur für std::string.


  • Mod

    Der letzte Code erinnert mich irgendwie an so schöne Funktionen in der Art:

    void foo(int i)
    {
      for (i = 0; i < 5; ++i)
        cout << "Bar!";
    }
    

    Schon öfters so gesehen.

    Vielleicht lernt der Threadersteller aus diesem Beispiel sogar, was bei ihm falsch läuft.


Anmelden zum Antworten