Compilerfehler



  • Hallo,

    ich habe gerade das Beispiel für einen Taschenrechner aus dem Stroustrup-Buch abgetippt und eine Fehlermeldung erhalten, obwohl ich alles korrekt abgetippt habe (soweit mich meine Augen nicht täuschen).

    Hier ist die main-Funktion, die den Fehler verursacht:

    istream* input;
    
    int main(int argc, char* argv[])
    {
    	switch(argc) {
    	case 1:
    		input=&cin;
    		break;
    	case 2:
    		input=new istringstream(argv[1]);
    		break;
    	default:
    		error("too many arguments");
    		return 1;
    	}
    
    	while(*input) {
    		get_token();
    		if(curr_tok==END) break;
    		if(curr_tok==PRINT) continue;
    		cout<<expr(false)<<endl;
    	}
    
        return errors;
    }
    

    Und der Fehler lautet:

    d:\c++\arbeitsbereiche_vc++\taschenrechner\main.cpp(136) : error C2514: 'std::basic_istringstream<char,struct std::char_traits<char>,class std::allocator<char> >' : Klasse besitzt keine Konstruktoren
    

    Was hat das zu bedeuten 😕



  • Achja: Es ist überigens die folgende Zeile betroffen:

    input=new istringstream(argv[1]);
    


  • Ohne jetzt wirklich ahnung von istringstreams zu haben analysire ich jetzt mal die fehlermeldung.

    std::basic_istringstream ... Klasse besitzt keine Konstruktoren

    wenn es also keine Konstruktoren gibt, kann höchstens ein default Konstruktor verwendet werden und kein Parameterbehafteter.

    wahrscheinlicher ist aber das du irgend ein include vergessen hast. darüber hast du hier nichts geschrieben.



  • Nein, die Klasse hat schon Konstruktoren ... die Fehlermeldung ist also entweder abgeschnitten oder eine dreiste Lüge 😉

    Eigentlich müsste das auch gehen ... welchen Compiler hast du? Hast du die richtigen #includes?



  • Sorry!

    Ich hab' im Buch einfach nicht weiter gelesen. 🙄

    Da stand, dass ich noch die Bibliothek <sstream> mit einbinden soll; ihr hattet recht.



  • Da stand, dass ich noch die Bibliothek <sstream> mit einbinden soll

    Das ist keine Bibliothek sondern ein Standard-Header. Welcher wiederum aber natürlich Teil der Standardbibliothek ist 😉



  • Erstmal danke, dass ihr hier reigeschaut habt. Ich hab' noch eine Frage. Der Taschenrechner wird jetzt fehlerlos kompiliert. Ich starte die Konsole und tippe

    taschenrechner.exe 5+5
    

    ein. Doch anstatt mir das Ergebnis auszugeben, erwartet er weitere Eingaben, so, als hätt' ich ihn einfach per Doppelklick gestartet. Ich hab' es auch schon mit

    taschenrechner.exe "5+5"
    

    versucht. Klappt aber auch nicht.

    Desweiteren würde ich gerne wissen, warum die folgende Schleife (hat jetzt nichts mit dem oberen Problem zu tun)

    while(cin) {
    		get_token();
    		if(curr_tok==END) break;
    		if(curr_tok==PRINT) continue;
    		cout<<expr(false)<<endl;
    	}
    

    als Bedingung 'cin' erhält? Es funktioniert doch auch mit 'while(true)'! Warum ausgerechnet cin bzw. '*input'?

    Herzliches Dankeschön schon mal.



  • *push*



  • ptc schrieb:

    als Bedingung 'cin' erhält? Es funktioniert doch auch mit 'while(true)'! Warum ausgerechnet cin bzw. '*input'?

    true läuft ewig, während cin eben nur solange läuft bis cin einen Fehler meldet bzw. bei *input bis input auf das 0 Zeichen am Ende des strings zeigt.


Anmelden zum Antworten