Fumitoshi UKAI <[EMAIL PROTECTED]> writes: > I think this is a bug of g++-4.0.
No, it's a documented change in behaviour. From http://gcc.gnu.org/gcc-4.0/changes.html * Friends of classes defined outside their namespace are correctly handled: namespace N { class A; } class N::A { friend class B; // Refer to N::B in GCC 4.0.0 // but ::B in earlier versions of GCC }; > It can be reprodusible by this code: > > % cat a.cc > namespace ns { > class A; > }; > class ns::A { > public: > A(int j) { i = j; }; > private: int i; > friend A operator+(const A& x, const A& y); ns::operator+ in gcc-4, ::operator+ in earlier versions. > }; > using namespace ns; > A operator+(const A& x, const A& y) { > return A(x.i + y.i); > } This is ::operator+ which is not a friend in gcc-4. If you use A ns::operator+(const A& x, const A& y) { return A(x.i + y.i); } you define the friend and it will compile, but I don't know if that's what you want. If you want to make ::operator+ a friend in gcc-4 use something like namespace ns { class A; }; ns::A operator+(const ns::A& x, const ns::A& y); class ns::A { public: A(int j) { i = j; }; private: int i; friend A (::operator+)(const A& x, const A& y); }; using namespace ns; A operator+(const A& x, const A& y) { return A(x.i + y.i); } -- Philip Martin -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]