C++ - ostream, Freunde und namespaces

Alles war gut, bis ich zog meine Objekte einem namespace. Und jetzt der compiler behauptet, dass meine Farbe, die Attribute sind private.

Ich dachte, der ganze Punkt von Freunden war, zu teilen gekapselte Informationen mit denen eine Klasse befreundet.

Farbe.h

friend ostream & operator << (ostream& output, const st::Color& color);

Color.cpp:

 ostream & operator <<(ostream& output, const st::Color& color) {

    output << "Colors:\nalpha\t: " << color.a << "\nred\t: "  << color.r << "\ngreen\t: " << color.g
            << "\nblue\t: " << color.b <<  "\nvalue\t: " << color.color();

    return output;
}

Fehler:

Color.h||In function 'std::ostream& operator<<(std::ostream&, const st::Color&)':|
Color.h|52|error: 'unsigned char st::Color::a' is private|
Color.cpp|15|error: within this context|
Color.h|49|error: 'unsigned char st::Color::r' is private|
Color.cpp|15|error: within this context|
Color.h|51|error: 'unsigned char st::Color::g' is private|
Color.cpp|15|error: within this context|
Color.h|50|error: 'unsigned char st::Color::b' is private|
Color.cpp|16|error: within this context|
||=== Build finished: 8 errors, 0 warnings (0 minutes, 1 seconds) ===|

Also, was ist der deal?
Ich bin mit Code::Blocks als meine IDE. Und es wird nicht einmal zeigen keine Eigenschaften oder Methoden verwenden, wenn ich den Punkt-operator auf die "Farbe" - parameter. Dies ist offensichtlich ein Zeichen, dass etwas schief geht...irgendwo.

Habe ich die Freund-operator überladen aus und es stellt so gut. Kein Fehler an anderer Stelle.
Was gibt?

Es ist wie folgt deklariert:

namespace st{

class Color {

    friend ostream & operator << (ostream& output, const st::Color& color);
 public:
     ....
 private:
    .....

};
};

Edit:

In meiner CPP habe ich jetzt getan:

namespace st{
ostream & st::operator <<(ostream& output, const st::Color& color) {

    output << "Colors:\nalpha\t: " << color.a << "\nred\t: "  << color.r << "\ngreen\t: " << color.g
            << "\nblue\t: " << color.b <<  "\nvalue\t: " << color.color();

    return output;
}
}

st::Color::Color() {

    reset();
}

st::Color::Color(const Color& orig) {

    a = orig.a;
    r = orig.r;
    g = orig.g;
    b = orig.b;
}

void st::Color::reset() {
    a = 0;
    r = 0;
    g = 0;
    b = 0;
}
... etc
}

Kein Compiler-Fehler, aber ist es normal für so eine situation zu verwenden den namespace wieder im header? Oder ist das völlig abseits von dem, was ich tun sollte?

Bearbeiten:
@Rob vielen Dank für deinen input, wie gut!

  • Was meinst du mit "verschoben meine Objekte einem namespace"?
  • Bewegen Sie das Objekt in zwischen einem namespace. I. E-namespace st{ Klasse... }
  • Verwenden Sie nicht den Namensraum wieder in die definition von operator<<. Sollte dies nicht nötig sein.
  • Du meinst nicht die definition im namespace im header?edit:Sorry, ich meinte CPP nicht-header in der obigen code.
  • fügen Sie die st-namespace-Deklaration um die ostream-Methode, in der Sie die cpp-Datei. siehe unten meine Antwort (ich habe versucht es unter Linux mit g++ es funktionierte gut).
InformationsquelleAutor Sidar | 2012-05-01
Schreibe einen Kommentar