Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » no match for operator<< [...]

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.11.2007, 17:03 Uhr
~funkStille
Gast


Hallo miteinander!

Weiß einer von euch, warum das letzte cout oben genannte Compilerfehlermeldung erzeugt, das vorletzte hingegen nicht?


C++:
#include <iostream>

using namespace std;

class Foo {
};

class Bar {
  public:
    Foo get() {
      return foo;
    }

  private:
    Foo foo;
};

ostream& operator<<(ostream& os, Foo& f) {
  os << "Bar!";
  return os;
};

int main(int argc, char** argv) {
  Foo foo;
  Bar bar;

  cout << foo << endl;
  cout << bar.get() << endl;
}



Getestet habe ich das Beispiel mit g++ in den Versionen 4.1.2 und 3.4.6. Die genaue Fehlermeldung (g++ 4.1.2) ist:


Code:
test.cc: In function 'int main(int, char**)':
test.cc:30: error: no match for 'operator<<' in 'std::cout << bar. Bar::get()'



Ich bin gespannt!

Viele Grüße,
funkStille
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.11.2007, 17:41 Uhr
mike
Pinguinhüpfer
(Operator)


Probier mal

C++:
ostream& operator<<(ostream& os, const Foo& f)



lg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.11.2007, 18:51 Uhr
xXx
Devil



C++:
#include <iostream>

template<typename T>
class container
{
    T m_data;

public:
    container(T const& data) : m_data(data) {}

public:
    T const& get() const { return m_data; }
    void set(T const& data) { m_data = data; }

public:
    friend std::ostream& operator <<(std::ostream& out, container const& data) { out << data.m_data; return out; }
};



C++:
int main()
{
    container<int> foo(10);
    std::cout << foo << std::endl;
}
... so ... also am einfachsten friend daraus machen ... dann kannst du auch auf den private-Bereich zugreifen ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.11.2007, 19:51 Uhr
~funkStille
Gast


Vielen Dank Mike, das const ist tatsächlich die Lösung.

Weißt du auch, warum das so ist? Prinzipell sollte ein Funktionsaufruf - auch wenn es sich um einen Operator handelt - doch auch mit nicht konstanten Parametern ausführbar sein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.11.2007, 20:37 Uhr
mike
Pinguinhüpfer
(Operator)


Naja - du brauchst eine Referenz weil es nicht kopiert werden darf - weder ostream noch das Klassenobjekt selbst. const sagt ja dass das Objekt nicht geändert werden darf.

Das von xXx solltest du auch noch beachten (wegen Nichelementfunktionen). Siehe www.parashift.com/c++-faq-lite/input-output.html#faq-15.8
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.11.2007, 00:44 Uhr
0xdeadbeef
Gott
(Operator)


Ne Referenz ist ja gegeben. Das Problem ist hier, dass es sich bei bar.get() um ein temporäres Objekt handelt, und die dürfen nur als konstante Referenz gebunden werden.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.11.2007, 08:15 Uhr
mike
Pinguinhüpfer
(Operator)


@0xdeadbeef: gegeben ist es schon - aber der Grund für die Erstere ist ja, dass ein ostream (allgemein Streams) nicht kopiert werden dürfen
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.11.2007, 09:03 Uhr
stephanw
localhorst


Aber der Stream soll doch gar nicht kopiert werden - es geht ja nur um das Argument "Foo&" . Und diese muss "const" sein, wenn man temporäre Objekte übergeben will.

Analoges Beispiel:

C++:

void quark(int& arg);

int main()
{
  quark(4711); // geht nicht, ginge aber für "void quark(const int& arg)"
}



--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.11.2007, 10:46 Uhr
~funkStille
Gast


Also, ich fasse mal zusammen:

1. Wenn Referenzen auf temporäre Objekte als Funktionsparameter übergeben werden, so müssen diese als konstant behandelt werden, weil temporäre Objekte nicht verändert werden dürfen.

2. Um mittels operator<< auf private Daten einer Klasse zugreifen zu können, sollte der operator in der Klasse als friend deklariert werden.

Vielen Dank allen Postern für die Aufklärung!

Viele Grüße,
funkStille
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.11.2007, 10:51 Uhr
mike
Pinguinhüpfer
(Operator)


Da sind jetzt Missverständnisse aufgetreten
Ich meinte, dass die erste Referenz ein muss ist, da streams nicht kopiert werden dürfen. Die 2te und const ist eben so bei diesem Operator und ist aber auch selbstsprechend: ich will ja beim Objekt nichts ändern - und schon gar nicht kopieren.

Das mit dem friend ist kein muss - sollte aber immer gemacht werden. Sonst sind unschöne Dinge möglich (cout << foo umdrehen etc.)
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: