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).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie deklarieren und definieren Operatoren in den gleichen Namensraum wie das Objekt als gut. Sie werden immer noch gefunden werden, durch Argument-Dependent Lookup.
Eine übliche Implementierung sieht wie folgt aus:
Bearbeiten
Es scheint, dass Sie nicht declarin Ihre
operator<<
im namespace und sind auch zu definieren, die es außerhalb des namespace. Ich hab eingestellt das code.print
- Funktion, die Annahme einerostream&
und einfach machen dieoperator<<
im umgebenden namespace freut sich auf diese Funktion.g++
;clang++
war okay für mich nur die Deklaration der friend-Teil, aber wenn ich versuchte, Sie zu kompilieren mitg++
, es würde nicht funktionieren ohne auch deklarierenstd::ostream& operator<<(std::ostream& o, const A& a);
im my-namespace. Vielen Dank für deine Antwort!Müssen Sie qualifizieren Ihre Betreiber mit dem namespace als gut. Es ist eine Funktion der Signatur erklärt im Namen den Raum, so dass der Zugriff auf sein symbol, das Sie brauchen, um das Präfix es mit dem namespace.
Versuchen Sie es so: