C++ -ostream, friends и пространства имен

Все было хорошо, пока я не переместил свои объекты в пространство имен. И теперь компилятор утверждает, что мои атрибуты Color являются приватными.

Я думал, что весь смысл друзей заключается в том, чтобы делиться инкапсулированной информацией с теми, с кем дружит класс.

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) ===|

Так в чем дело? Я использую блоки кода ::в качестве своей IDE. И он даже не покажет никаких свойств или методов, когда я использую оператор точки в параметре «цвет». Это явно признак того, что что-то идет не так... где-то.

Я исключил перегрузку оператора друга, и он прекрасно компилируется. В другом месте ошибки нет. Что дает?

Объявлено следующим образом:

namespace st{

class Color {

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

};
};

Редактировать:

В моем 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, спасибо за ваш вклад!

8
задан Sidar 1 May 2012 в 23:37
поделиться