mikrocontroller.net

Forum: PC-Programmierung Operator overloading für vektoren C++


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Ada (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche gerade den: << Operator, für Vektoren zu deklarieren und zu 
definieren, bekomme bei der Ausführung aber folgende Fehlermeldung:

error: no match for 'operator<<' (operand types are 'std::ostream {aka 
std::basic_ostream<char>}' and 'std::vector<Book>')




Auszug des Quellcodes:
// Library.h

class Library {
public:
    Library();
    void showBooks() {cout << mBook;}   // In dieser Zeile Fehlermeldung
    
private:
    vector<Book> mBook;
};

ostream& operator<<(ostream& os, const vector<Book>& b);

// Library.cpp

ostream& operator<<(ostream& os, const vector<Book>& b)
{
    for(auto& book : b)
        os << book;
    return os;
}



Autor: Ada (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo liegt mein Fehler?

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wo liegt mein Fehler?

- falsche Reihenfolge
- grund- und nutzlose, fehlerverursachende Implementierung im Headerfile

HTH

Autor: Ada (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
g457 schrieb:
> - falsche Reihenfolge
> - grund- und nutzlose, fehlerverursachende Implementierung im Headerfile

Gehts auch genauer bitte

Autor: tictactoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre
friend ostream& operator<<(ostream& os, const Library& b);
nicht viel logischer?

Autor: Ada (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tictactoe schrieb:
> Wärefriend ostream& operator<<(ostream& os, const Library& b);
> nicht viel logischer?

Wenn ich so drüber nachdenke, ja du hast Recht.

Autor: Sebi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ada schrieb:
> Gehts auch genauer bitte

Dein operator<< steht im Header nach der Definition deiner showBooks() 
Funktion. Pack die Deklaration deines Operators davor, dann kennt der 
Compiler den Operator auch.

Autor: Ada (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe es jetzt anders gelöst (in Anlehnung an den Vorschlag von 
tictactoe), dann spielt die Reihenfolge auch keine Rolle mehr (danke für 
den Hinweis Sebi):

// Library.h

class Library {
public:
    Library();
    void showBooks() {return mBook;}   // In dieser Zeile Fehlermeldung
    
private:
    vector<Book> mBook;
};

ostream& operator<<(ostream& os, const Library& l)



// Library.cpp

ostream& operator<<(ostream& os, const Library& l)
{
    for( auto& book : l.showBooks() )  // l.showBooks() entspricht dem Vektor mBook
        os << book;                
    return os;
}



g457 schrieb:
> - falsche Reihenfolge
> - grund- und nutzlose, fehlerverursachende Implementierung im Headerfile
>
> HTH

Hört sich so an als sei mein Programmierstil nicht der beste, vielleicht 
kann mir jemand ne gute Referenz nennen damit ich mich da verbessern 
kann?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.