Wie funktioniert das unter MS VisualC++?

Von: , Frage gestellt am Di, 9. Feb 2010

Hallo!

Ich habe ein (für mich) sehr schönes Beispiel für die Nutzung von 'List'en (STL) gefunden:

http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL...


Nur, das Beispiel stammt aus der Linux-Welt und ich arbeite momentan unter Windows. Daher meiner Frage:

Die Anweisung
class AAA 
{
friend ostream &operator<<(ostream &, const AAA &);
public:
int x;
int y;
float z;
...
};
...
ostream &operator<<(ostream &output, const AAA &aaa)
{
output <<< aaa.x << ' ' << aaa.y << ' ' << aaa.z << endl;
return output;
}
...
main()
{
list<AAA> L;
...
list<AAA>::interator i;
for (i=L.begin(); i!=L.end(); ++i) cout << *i << " ";
cout << endl;
...
return 0;
}


liefert beim Kompilieren der Operator '<<' in main() folgenden Fehler:
"...: error C2593: 'Operator <<' ist mehrdeutig".
Da das kleine Program ansonsten Funktioniert, gehe ich davon aus, das dies ein MS-VC++-typisches "Problem" ist. Aber wie kann man dieses Operator-Überladen mit MS-VC++ richtig aufbauen?

Besten Dank und viele Grüße
Andaron

11 Antworten zu dieser Frage

  1. Antwort von nach 8 Stunden 0 hilfreich
    Re: Wie funktioniert das unter MS VisualC++?

    Hi,

    gibt mal das ganze (nicht funktionierende) Programm hier ein, inklusive aller includes.

    Zumindestens

    list<AAA>::interator i;
    


    ist nicht korrekt, es könnten aber auch wichtige Headers fehlen.

    Gruss
    norsemanna

    • Antwort von nach 16 Stunden 0 hilfreich
      Re^2: Wie funktioniert das unter MS VisualC++?

      Hallo!

      Der beschriebene Fehler ist leider nur ein Tippfehler.
      Hier nochmal der gesamte Code (wie gesagt, original kopiert von

      http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL...
      )

      // Standard Template Library example using a class.
      #include <iostream>
      #include <list>
      using namespace std;
      // The List STL template requires overloading operators =, == and <.
      class AAA
      {
      friend ostream &operator<<(ostream &, const AAA &);
      public:
      int x;
      int y;
      float z;
      AAA();
      AAA(const AAA &);
      ~AAA(){};
      AAA &operator=(const AAA &rhs);
      int operator==(const AAA &rhs) const;
      int operator<(const AAA &rhs) const;
      };
      AAA::AAA()   // Constructor
      {
      x = 0;
      y = 0;
      z = 0;
      }
      AAA::AAA(const AAA ©in)   // Copy constructor to handle pass by value.
      {                             
      x = copyin.x;
      y = copyin.y;
      z = copyin.z;
      }
      ostream &operator<<(ostream &output, const AAA &aaa)
      {
      output << aaa.x << ' ' << aaa.y << ' ' << aaa.z << endl;
      return output;
      }
      AAA& AAA::operator=(const AAA &rhs)
      {
      this->x = rhs.x;
      this->y = rhs.y;
      this->z = rhs.z;
      return *this;
      }
      int AAA::operator==(const AAA &rhs) const
      {
      if( this->x != rhs.x) return 0;
      if( this->y != rhs.y) return 0;
      if( this->z != rhs.z) return 0;
      return 1;
      }
      // This function is required for built-in STL list functions like sort
      int AAA::operator<(const AAA &rhs) const
      {
      if( this->x == rhs.x && this->y == rhs.y && this->z < rhs.z) return 1;
      if( this->x == rhs.x && this->y < rhs.y) return 1;
      if( this->x < rhs.x ) return 1;
      return 0;
      }
      main()
      {
      list<AAA> L;
      AAA Ablob ;
      Ablob.x=7;
      Ablob.y=2;
      Ablob.z=4.2355;
      L.push_back(Ablob);  // Insert a new element at the end
      Ablob.x=5;
      L.push_back(Ablob);  // Object passed by value. Uses default member-wise
      // copy constructor
      Ablob.z=3.2355;
      L.push_back(Ablob); 
      Ablob.x=3;
      Ablob.y=7;
      Ablob.z=7.2355;
      L.push_back(Ablob); 
      list<AAA>::iterator i;
      for(i=L.begin(); i != L.end(); ++i) cout << (*i).x << " "; // print member
      cout << endl;      
      for(i=L.begin(); i != L.end(); ++i) cout << *i << " "; // print all
      cout << endl;
      cout << "Sorted: " << endl;
      L.sort();
      for(i=L.begin(); i != L.end(); ++i) cout << *i << " "; // print all
      cout << endl;
      return 0;
      }
      


      lg Andaron

      • Antwort von nach 17 Stunden 0 hilfreich
        Re^3: Wie funktioniert das unter MS VisualC++?

        funktioniert doch tadellos

        ich glaub eher das du dir einfach mal VS-Express gedownloaded hast, copy paste, und fertig, aber sorry, visual studio hat projekte um schonmal das grundkonzept (Fenster) mitzuliefern, (alles läuft in einem fenster , auch dein code).

        also als Konsolen 32 anwendung debugged mit unterem code, wo ich auch die einstiegsmarke main in t_main geändert habe . Und die "stdafx.h" darf auch nicht fehlern, Visual studio braucht das so als einstiegspunkt damit überhaupt lauffähige ist, wir sind ja nichtmehr auf DOS und für windows braucht es etwas mehr :-)


        // konsole_win32_beispiel.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
        //
        #include "stdafx.h"
        #include <iostream>
        #include <list>
        using namespace std;
        // The List STL template requires overloading operators =, == and <.
        class AAA
        {
        friend ostream &operator<<(ostream &, const AAA &);
        public:
        int x;
        int y;
        float z;
        AAA();
        AAA(const AAA &);
        ~AAA(){};
        AAA &operator=(const AAA &rhs);
        int operator==(const AAA &rhs) const;
        int operator<(const AAA &rhs) const;
        };
        AAA::AAA()   // Constructor
        {
        x = 0;
        y = 0;
        z = 0;
        }
        AAA::AAA(const AAA ©in)   // Copy constructor to handle pass by value.
        {                             
        x = copyin.x;
        y = copyin.y;
        z = copyin.z;
        }
        ostream &operator<<(ostream &output, const AAA &aaa)
        {
        output << aaa.x << ' ' << aaa.y << ' ' << aaa.z << endl;
        return output;
        }
        AAA& AAA::operator=(const AAA &rhs)
        {
        this->x = rhs.x;
        this->y = rhs.y;
        this->z = rhs.z;
        return *this;
        }
        int AAA::operator==(const AAA &rhs) const
        {
        if( this->x != rhs.x) return 0;
        if( this->y != rhs.y) return 0;
        if( this->z != rhs.z) return 0;
        return 1;
        }
        // This function is required for built-in STL list functions like sort
        int AAA::operator<(const AAA &rhs) const
        {
        if( this->x == rhs.x && this->y == rhs.y && this->z < rhs.z) return 1;
        if( this->x == rhs.x && this->y < rhs.y) return 1;
        if( this->x < rhs.x ) return 1;
        return 0;
        }
        int _tmain(int argc, _TCHAR* argv[])
        {
        list<AAA> L;
        AAA Ablob ;
        Ablob.x=7;
        Ablob.y=2;
        Ablob.z=4.2355;
        L.push_back(Ablob);  // Insert a new element at the end
        Ablob.x=5;
        L.push_back(Ablob);  // Object passed by value. Uses default member-wise
        // copy constructor
        Ablob.z=3.2355;
        L.push_back(Ablob); 
        Ablob.x=3;
        Ablob.y=7;
        Ablob.z=7.2355;
        L.push_back(Ablob); 
        list<AAA>::iterator i;
        for(i=L.begin(); i != L.end(); ++i) cout << (*i).x << " "; // print member
        cout << endl;      
        for(i=L.begin(); i != L.end(); ++i) cout << *i << " "; // print all
        cout << endl;
        cout << "Sorted: " << endl;
        L.sort();
        for(i=L.begin(); i != L.end(); ++i) cout << *i << " "; // print all
        cout << endl;
        return 0;
        }
        

        • Antwort von nach einem Tag 0 hilfreich
          Re^4: Wie funktioniert das unter MS VisualC++?

          aber sorry, visual studio hat
          projekte um schonmal das grundkonzept (Fenster) mitzuliefern,
          (alles läuft in einem fenster , auch dein code).
          Also das ist schon mal Blödsinn... wer kein Fenster braucht, bestellt keins (indem er ein Konsolenprojekt anlegt) und gut ist's. also als Konsolen 32 anwendung debugged mit unterem code, wo
          ich auch die einstiegsmarke main in t_main geändert habe . Und
          die "stdafx.h" darf auch nicht fehlern, Visual studio braucht
          das so als einstiegspunkt damit überhaupt lauffähige ist, wir
          sind ja nichtmehr auf DOS und für windows braucht es etwas
          mehr :-)
          So ein Quatsch mit Soße. _tmain ist ein #define-Hack, um - in den Projekteinstellungen umschaltbar - ein Unicode- oder ein Nichtunicode-Main haben zu können, mit anderen Worten ein main mit wchar_t**- oder ein main mit char**-Parameter

          Man kann auch einfach int main(int, char**) schreiben und sich das Gehampel sparen.

          Das historisch bedingt schwachsinnig benannte "stdafx.h" ist nur notwendig, wenn man in seinem Projekt vorkompilierte Header nutzen möchte. Wer will das bei einem Tutorialprojekt ernsthaft? Leider sind vorkompilierte Header per default in VS-Projekten eingeschaltet, es ist aber alles andere als notwendig.

          Grüße,
          Sebastian

          • Antwort von nach einem Tag 0 hilfreich
            Re^5: Wie funktioniert das unter MS VisualC++?

            aber sorry, visual studio hat
            projekte um schonmal das grundkonzept (Fenster) mitzuliefern,
            (alles läuft in einem fenster , auch dein code).
            Also das ist schon mal Blödsinn... wer kein Fenster braucht,
            bestellt keins (indem er ein Konsolenprojekt anlegt) und gut
            ist's.
            danke für die berechtigten diversen korrekturen, bzw das erklären was wofür ist .

            Ich hab die ganzen schalter nie gefunden, die handbücher sind immer alle veraltet , supi , endlich mal ein paar grundlagen !

            • Antwort von nach 2 Tagen 0 hilfreich
              Re^6: Wie funktioniert das unter MS VisualC++?

              Sorry, aber ich verstehe von dem, was ihr da beschreibt leider fast nichts, da ich mich erst in MS-VC++ einarbeite. Das Grundkonzept von C habe ich bereits vor Jahren (bald Jahrzehnten) kennengelernt und OOP lerne ich gerade dazu. Aber die von euch beschriebenen Feinheiten sind mir weitgehend noch unbekannt. Deshalb versuche ich mich ja an solchen Tutorials.

              Trotzdem vielen Dank für eure Tipps. Ich sehe mir solche Postings gerne an, da sie mich auf Ideen bringen, was sonst nicht in den "einfachen" Tutorials steht.

              Und was vieleicht hier noch wichtig ist: ich arbeite bis jetzt in Konsolen ohne Fenster. Die sind erst als nächstes drann...

              lg
              Andaron

            • Antwort von nach 3 Tagen 0 hilfreich
              Re^7: Wie funktioniert das unter MS VisualC++?

              Sorry, aber ich verstehe von dem, was ihr da beschreibt leider
              fast nichts, da ich mich erst in MS-VC++ einarbeite. Das
              Grundkonzept von C habe ich bereits vor Jahren (bald
              Jahrzehnten) kennengelernt und OOP lerne ich gerade dazu. Aber
              die von euch beschriebenen Feinheiten sind mir weitgehend noch
              unbekannt. :
              lass mal meine feinheiten da raus, er hat recht, ich hab unrecht, ganz einfach :-)

  2. Antwort von nach einem Tag 0 hilfreich
    Re: Wie funktioniert das unter MS VisualC++?

    Ich habe ein (für mich) sehr schönes Beispiel für die Nutzung
    von 'List'en (STL) gefunden:

    http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL...

    [...] liefert beim Kompilieren der Operator '<<' in main() folgenden
    Fehler:
    "...: error C2593: 'Operator <<' ist mehrdeutig".
    Hallo Andaron,

    ich habe deinen Code mit den Compilern von VS2005 und VS2008 probiert (auf der Kommandozeile mit cl.exe). In beiden Visual-Studio-Versionen kompiliert der Code, den du im Nachbarzweig gepostet hast, sobald man "main()" mit einem (in C++ nicht optionalen) Rückgabetyp versieht.

    Welche Visual-Studio-Version benutzt du? Hast du auf der Kommandozeile gearbeitet, oder hast du ein Studio-Projekt angelegt?

    Grüße,
    Sebastian

    • Antwort von nach 2 Tagen 0 hilfreich
      Re^2: Wie funktioniert das unter MS VisualC++?

      Hallo!

      Meine Version MS-VC++ 6.0 (schon etwas älter, aber dafür ein lizensierte Vollversion). Ich arbeite auf der Komandozeile (cmd.exe unter Windows). Und ein Projekt wird immer automatisch angelegt.

      Sprich: Ich habe den Quellcode mit copy'n'paste rübergezogen, die Kompilierung gestartet, den Hinweis auf automatische Erzeugung eines Projektes abgenickt und über die Fehlermeldung gestaunt (mehrmals). Ich bin mir also keiner Schuld bewußt ;-)

      lg
      Andaron



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!