Fehler bei Template-Funktionsaufruf
-
Hab da ein Problem.
#include <iostream> #include <typeinfo> using namespace std; template <class T> int getint(void); int main(void){ cout<<"Zahl Eingeben!\n\n"; int u; u=getint(); return 0; } template <class T> T getint(void){ // ////// T a; for(;;){ cin>>a; if(typeid(a)!=typeid(int)){ cout<<"\nFalsche Eingabe.\n"; continue; }} // ///// return a; }
Error: no matching function for call to 'getint()'
Ich habe die funktion getint() doch parameterlos deklariert (und definiert),
der Compiler will aber keine finden(?).Finde den Fehler.
VD im Voraus
P.S.: Bitte nicht auf das Programm selbst beziehen, nur auf den Konkreten Fehler.
-
Der Compiler kann den gewünschten Typ nicht aus dem, was mit dem Rückgabewert gemacht wird ableiten.
Hier wäre fertig.
Wieso verlässt du dich nicht auf die Konvertierung und Fehlererkennung der Streams?
-
EOutOfResources schrieb:
Wieso verlässt du dich nicht auf die Konvertierung und Fehlererkennung der Streams?
Na weil.
Aber danke für den Tipp.
Nach deiner "Theorie" müsste das aber kompilieren (was es nicht tut):#include <iostream> #include <typeinfo> using namespace std; template <class T> int getint(void); int main(void){ cout<<"Zahl Eingeben!\n\n"; int u; u=getint(); return 0; } template <class T> int getint(void){ // ////// T a; for(;;){ cin>>a; if(typeid(a)!=typeid(int)){ cout<<"\nFalsche Eingabe.\n"; continue; }} // ///// return a; }
Oder muss a gleich ein Integral sein ?
-
Nein, so meinte ich das nicht. Direkt auf die Typenkonvertierung der Streams vertrauen -> Keine Templates
-
Das Problem ist, der Compiler kann den Templatetyp nur anhand der Parameter herleiten, nicht jedoch anhand des Rückgabetyps. Da beim ersten Versuch nur der Rückgabetyp vom Templateparameter abhängig war und beim zweiten Versuch nichts von beidem, funktioniert das nicht.
Du musst, wenn Du das so haben willst, schon getint<int>() aufrufen.
-
LordJaxom schrieb:
Du musst, wenn Du das so haben willst, schon getint<int>() aufrufen.
Hat sich schon erledigt, ich hab schlauerweise komplett auf Templates verzichtet,
da mir explizite Template-argumente schon als zu komplex schienen (auch wenn Sie nicht nötig wären...egal.). Die Funktion sieht jetzt so aus:inline long long getint(void){ // ////// char *a=new char[50]; long long b=0; bool cht=false; us *ct=new us; cin.getline(a,50); for(signed short c=0;c<10;c++){ switch(a[c]){ case '-': if(c!=0){ a[c]='l'; --c; continue;} cht=true; break; case '+': if(c!=0){ a[c]='l'; --c; continue;} break; case '1': b*=10; ++b; ++*ct; break; case '2': b*=10; b+=2; ++*ct; break; case '3': b*=10; b+=3; ++*ct; break; case '4': b*=10; b+=4; ++*ct; break; case '5': b*=10; b+=5; ++*ct; break; case '6': b*=10; b+=6; ++*ct; break; case '7': b*=10; b+=7; ++*ct; break; case '8': b*=10; b+=8; ++*ct; break; case '9': b*=10; b+=9; ++*ct; break; case '0': b*=10; ++*ct; break; case '\0': c=10; break; default: cout<<"Fehler bei der Analyse, bitte Erneut Zahl eingeben:"<<endl; cin.getline(a,50); b=0;c=-1; cht=false; }} // ///// if(cht==true) b-=2*b; delete [] a; return b; }
-
Das ist jetzt wohl nicht dein Ernst, oder?
-
Warum genau kannst du nicht einfach cin >> myint machen!?
-
hahaha!
mach mal
unsigned short a; cin>>a;
und gib einen Buchstaben ein.
Voila, du bekommst eine hübsche Überraschung!!Dafür ist die Funk. ja auch in 'ner Bibliothek.
Denkst du ich will jeden Quellcode um 106 Zeilen QCode für diesen Blödsinn verlängern ...?
Man man man!
-
hahaha!
schau mal für was ios::fail() gut is
-
Neehh, lieber nicht...
War doch nur ein von mir versuchter Versuch, mein Gott...
-
Ja und auch Versuche darf man anständig machen, oder?
-
Bitte ?
-
Darf ich das auf http://thedailywtf.com/ posten?
-
camper schrieb:
Darf ich das auf http://thedailywtf.com/ posten?
Ich glaube die nehmen nur professionellen Code. Aber im Forum bietet das gewiss Erheiterung
-
<*)))><
Meinetwegen, poste ruhig.
-
Sie schließen explizit Forenbeiträge als Quelle aus.
-
case '1': b*=10; ++b; ++*ct; break; case '2': b*=10; b+=2; ++*ct; break; case '3': b*=10; b+=3; ++*ct; break; case '4': b*=10; b+=4; ++*ct; break; case '5': b*=10; b+=5; ++*ct; break; case '6': b*=10; b+=6; ++*ct; break; case '7': b*=10; b+=7; ++*ct; break; case '8': b*=10; b+=8; ++*ct; break; case '9': b*=10; b+=9; ++*ct; break; case '0': b*=10; ++*ct; break; case '\0': c=10; break;
ist
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': b=10*b+(a[c]-'0'); ++*ct; break;
-
Respekt, also da wär ICH NIE drauf gekommen, dass bei jeder Ziffer sie selbst dazu-addiert wird.
Ich hab aber bei der einen Zeile statt
(a[c]-'0') -> (a[c]-48) stehen.
-
Hacker schrieb:
Ich hab aber bei der einen Zeile statt
(a[c]-'0') -> (a[c]-48) stehen.Du scheinst ein Talent dafür zu haben, Code unleserlich und mühsam zu machen
Im Ernst: Nimm
'0'
, wenn du die Ziffer 0 meinst.