Все было нормально, пока я не переместил объекты в пространство имен. И теперь компилятор утверждает, что мои атрибуты цвета являются частными.C++ - ostream, friends и namespaces
Я думал, что все друзья должны делиться инкапсулированной информацией с теми, кто подружится.
Color.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;
}
ошибка:
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) ===|
Так что это дело? Я использую Code :: Blocks как свою IDE. И он даже не покажет никаких свойств или методов, когда я использую оператор точки в параметре «цвет». Это, очевидно, признак того, что что-то пошло не так ... где-то.
Я перебрал оператора-друга, и он просто компилируется. Нет ошибки в другом месте. Что дает?
Он объявлен следующим образом:
namespace st{
class Color {
friend ostream & operator << (ostream& output, const st::Color& color);
public:
....
private:
.....
};
};
Edit:
В моей CPP Я теперь сделал это:
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
}
Нет ошибок компиляции, но это нормально для такого ситуация снова использовать пространство имен в заголовке? Или это полностью от того, что я должен делать?
Редактировать: @Rob спасибо за ваш вклад!
Что вы имеете в виду под «пошевелил объекты в пространстве имен»? – jedwards
Перемещение объекта между пространством имен. I.E namespace st {class ...} – Sidar
Не используйте пространство имен еще раз в определении 'operator <<'. Это не обязательно. – pmr