C++ Visual Studio 2010 C2679 / C2084 Fehler

Evo8 Racer

Lt. Commander
Registriert
Feb. 2007
Beiträge
1.792
Hallo,
und zwar habe ich ein Problem, dass in Visual Studio 2010 der Operator ( "<<" / ">>" ) nicht erkannt wird (C2679).

Visual Studio 2010 schrieb:
Fehler 4 error C2678: Binärer Operator '>>': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'std::istream' akzeptiert (oder keine geeignete Konvertierung möglich) C:\Users\Christopher\Desktop\Namen_eingeben\main.cpp 25






Das andere Problem ist das er mit den set- und get- Methoden nicht klar kommt.
Visual Studio 2010 schrieb:
Fehler 9 error C2084: Funktion 'Bier::Bier(std::string,std::string,int)' hat bereits einen Funktionsrumpf c:\users\christopher\desktop\namen_eingeben\bier.cpp 11




Wenn ich das Programm mit Codeblocks starte funktioniert es ohne Probleme.



Ich hatte Visual Studio 2010 vorher nur für C#-Programme genommen, aber nur wollte ich es auch für C++ nutzen.
Visual Studio 2010 hab ich auch für C++ Konfiguriert.
 

Anhänge

  • C2679.JPG
    C2679.JPG
    419,9 KB · Aufrufe: 288
Hi,

ändere mal den Datentyp e1 und e2 in char. Dann sollte es gehen. Oder noch #include <string> einfügen. :)Für das Problem mit der set und get Methode müsste ich den Code mal sehen. Gruß Steven
 
Zuletzt bearbeitet:
Danke für die Antwort.
Es muss der Datentyp "string" bleiben, da ich eine Kette von Zeichen eingeben will.

Wie geschrieben mit code blocks funktioniert das Programm soweit.
 
Dann füge doch #include <string> ein. Sonst kennt er den Datentyp nicht.
 
Zuletzt bearbeitet:
Himmel, poste halt wenigstens mal den relevanten Codeausschnitt! Dein Compiler meckert über Zeile 59 in bier.cpp, aber in deinem screenshot sieht man lediglich main.cpp.
 
Dass es in Code::Blocks funktioniert ist "Zufall", weil im Standard nirgendwo geschrieben steht, dass iostream string miteinbinden muss, aber scheinbar tut das der gcc, aber VC nicht. Also musst du, um Standardkonform zu bleiben, string einbinden. (BTW: nur weil es der gcc frisst, heißt es noch lange nicht, dass das Programm keine Fehler hat (syntaktisch und semantisch)).

Zur zweiten Fehlermeldung: Wie sieht deine Bier.h aus, ich denke da könnte der Hund begraben liegen (oder du verwendest Konstruktorüberladung und beide sind aus versehen gleich).
 
Hier die Bier.cpp und die Bier.h
 

Anhänge

  • bier.cpp.jpg
    bier.cpp.jpg
    409,7 KB · Aufrufe: 211
  • bier.h.jpg
    bier.h.jpg
    385,1 KB · Aufrufe: 192
Kopiere und paste den Quellcode das nächste mal einfach mit Hilfe von
Code:
 tags anstatt Screenshots zu machen.  Man sieht jetzt nämlich wieder nicht, welche Header deine bier.cpp so alles inkludiert. Aber wie schon vorher erwähnt, solltest du in deiner bier.h auf jeden Fall <string> inkludieren.
 
main.cpp

Code:
#include <iostream>
#include <stdlib.h>
#include "cstdlib"
#include "bier.h"

using namespace std;

void menue();

int main()
{
    menue();
    cout << endl << endl;
    system("PAUSE");
}

void menue()
{
    system("CLS");
    cout << "TestTrinken" << endl;
    cout << "~~~~~~~~~~~" << endl << endl;
    string e1, e2;
    int an;
    cout << "\n\nBiersorte: ";
    cin >> e1;
    cout << "\nAlkoholgehalt: ";
    cin >> e2;
    cout << "Anzahl der Flaschen im Kuehlschrank: ";
    cin >> an;
    Bier* b1 = new Bier(e1, e2, an);
    int wahl;

 do 
 {
    cout << "TestTrinken" << endl;
    cout << "~~~~~~~~~~~" << endl << endl;
    cout << " (1) Bier trinken..." << endl;
    cout << " (2) losfahren und ein neues Sixpack Bier kaufen..." << endl;
    cout << " (3) Alkoholtest..." << endl;
    cout << " (4) Geld in der linken Hosentasche anzeigen..." << endl;
    cout << " (0) Programm Beenden..." << endl;
    cout << "\nIhre Wahl: ";
    cin >> wahl;

    switch(wahl)
        {
            case 1:
                {
                    b1 -> ausgabe();
                    break;
                }
            case 2:
                {
                    break;
                }
            case 3:
                {
                    break;
                }
            case 4:
                {
                    break;
                }
            case 0:
                {
                    system("CLS");
                    cout << "\n\n\nProgramm wird beendet...\n\n\n";
                    exit(0);
                    break;
                }
            default:
                {
                    menue();
                    break;
                }
        }
    }while(wahl != 0);
}

bier.h

Code:
#ifndef BIER_H_INCLUDED
#define BIER_H_INCLUDED
#include <iostream>
#include <string>

using namespace std;

class Bier
{
    // Attribute
    private:
        string bier;
        string alc;
        int anz;

    // Methoden
    public:
        Bier();
        Bier(string, string, int);
        ~Bier();
        virtual void ausgabe();
        void setBier(string);
        string getBier();
        void setAlc(string);
        string getAlc();
        void setAnz(int);
        int getAnz();
};

#include "bier.cpp"
#endif // BIER_H_INCLUDED

Bier.cpp

Code:
#include "bier.h"


/*Bier::Bier()
{
    bier = "Radeberger";
    alc = "4,5";
    anz = 12;
}*/

Bier::Bier(string b, string a, int an)
{
    bier = b;
    alc = a;
    anz = an;
}

Bier::~Bier()
{
    //cout << "\n\nBier - Objekt wurde gelöscht";
}

void Bier::setBier(string b)
{
    bier = b;
}

string Bier::getBier()
{
    return bier;
}

void Bier::setAlc(string a)
{
    alc = a;
}

string Bier::getAlc()
{
    return alc;
}

void Bier::setAnz(int an)
{
    anz = an;
}

int Bier::getAnz()
{
    return anz;
}

void Bier::ausgabe()
{
    cout << endl << endl;

    if(anz != 0)
    {
        anz = anz - 1;
        cout << "\n\nBier " << bier << " getrunken mit " << alc <<" % Alkoholgehalt: " << endl;
        if(anz != 0)
        {
            cout << "\n Es sind noch " << anz << " Flaschen " << bier << " im Kühlschrank.\n\n";
        }
        else
        {
            cout << "\nEs sind keine Flaschen " << bier << " mehr im Kuehlschrank." << endl;
        }
    }
    else
    {
        cout << "Es ist kein Bier mehr im Kuehlschrank." << endl;
    }
}
 
Zuletzt bearbeitet:
Nein leider nicht, muss ich noch etwas inkludieren?

Weil es kommen immer noch die Fehlermeldungen mit dem Funktionsrumpf.


Ich glaub ich Wechsel wieder zu Code::Blocks für c++, und VS2010 für C#. ^^

Ich hätte nie gedacht, dass das mit den Compilern so unterschiedlich sein kann.
 

Anhänge

  • C2084.JPG
    C2084.JPG
    82,5 KB · Aufrufe: 141
Vielen Dank euch allen jetzt läuft´s mit Visual Studio 2010.

@ MagicAndre1981


warum muss ich die Bier.cpp nicht inkludieren aber in Code::Blocks schon?
 
Weil du in Code-Blocks wahrscheinlich nur deine main.cpp kompilierst, aber VS es richtig macht und alle cpp's kompiliert.
CB:
main.cpp->Bier.h->Bier.cpp->Bier.h(leer wegen #ifndef #define #endif Konstrukt)
VS:
main.cpp->Bier.h->Bier.cpp->Bier.h(..)
Bier.cpp->Bier.h->Bier.cpp->bumms
 
Evo8 Racer schrieb:
warum muss ich die Bier.cpp nicht inkludieren aber in Code::Blocks schon?

Keine Ahnung, wie du das hinbekommen hast, daß es in Code::Blocks funktioniert. Eigentlich ist es immer verkehrt. Der Compiler kompiliert eigentlich immer nur sogenannte Übersetzungseinheiten. Das sind die .c / .cpp / .cc-Dateien, die du in einem Makefile oder irgend einer anderen Projektstruktur angegeben hast. Diese Übersetzungseinheiten können dann über Inklude-Direktiven jede Menge Header mitreinziehen.

Aus deinem ersten Screenshot wird ersichtlich, dass dein Visual C++ Projekt aus den Übersetzungseinheiten:

  • bier.cpp
  • kaufen.cpp
  • main.cpp

besteht. Jetzt hast du aber in deinem bier.h-Header zusätzlich noch mal bier.cpp inkludiert. Dadurch sind dann plötzlich die in bier.cpp gemachten Definitionen im Programm 2 mal da, und das wird dem Linker dann ganz und gar nicht schmecken.
 
Evo8 Racer schrieb:
warum muss ich die Bier.cpp nicht inkludieren aber in Code::Blocks schon?



Beim VS hast du beide CPP Dateien in das Projekt eingebunden. Damit hat das VS die Implementierung schon gefunden und wenn du die CPP Datei dann in der .h wieder includest ist sie 2 mal vorhanden und du bekommst den Fehler.
 

Ähnliche Themen

Zurück
Oben