Templateproblem
-
Hi, die variable shit wird nicht ausgegeben. Brauch ich nen überladungsoperator?
#include <iostream> using namespace std; template <class t> t rechner (t test1) { t shit; for (typename t :: iterator i=test1.begin (); i!=test1.end (); i++) { shit++; } return shit; } int main () { string bs = "Hallo"; string out = rechner (bs); cout << out; }
-
Sag mal, was denkst du, soll wohl der Inkrement-Operator bei
std::stringmachen?
-
Inkrementoperator? Bin mir nicht sicher was du damit meinst. Zeile 8 in der Schleifendefinition? Also die schleife soll solange laufen, wie es buchstaben im string gibt.
Oder meinst du t shit wird als string angesehen?
-
kamelkacke schrieb:
Inkrementoperator? Bin mir nicht sicher was du damit meinst.
Er meint das hier: shit++;
-
kamelkacke schrieb:
Oder meinst du t shit wird als string angesehen?
Was ist denn t deiner Meinung nach hier?
P.S.: "Wird nicht ausgegeben"? Ist das wirklich die Fehlerbeschreibung, die du hier geben willst? Mit welchem Compiler hast du den Code übersetzt?
-
Nene. kompiliert nicht, mit der begrüdung, die Acroth nannte: inkrementoperator.
Dachte der compiler kommt von selbst drauf den richtigen datentypen zu definieren, da es sich bei so einem operator um einen datentyp handeln sollte der dazu fähig ist.
Und wie loest man das Problem? Nen int als zusätzlichen Parameter der ausgegeben wird?
-
Der Compiler kommt schon darauf, was t sein soll. Schließlich übergibst du ein Objekt vom Typ t.
Was willst du überhaupt erreichen?
-
Und wie loest man das Problem?
Ich weiss nicht, wie man dir klar macht: Was du machst ist quatsch. Wo soll der Operator ++ auf einem std::string definiert sein?
-
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.
-
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> ?
-
kamelkacke schrieb:
Achso! Gibts denn sowas wie <class t, class x> ?
Ja, natürlich.
typenameundclasssind 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; }