g ++ 4.5找不到好友功能

str*_*ppi 3 c++ g++ friend

天儿真好!

我有一个关于friend在C++中使用的问题.考虑以下代码:

#include <ostream>

struct F {
};

struct N {
  friend std::ostream& operator<< (std::ostream&, const N&);
  friend std::ostream& operator<< (std::ostream&, const F&);    
};

void foo(std::ostream &out) {
  F bar;
  out << bar;
}
Run Code Online (Sandbox Code Playgroud)

我的理解总是,这与函数可以访问类的私有部分的附加属性friend类似.在这个假设下,代码应该编译,因为有一个需要a 和a(const).staticfriendoperator<<ostream&F&

似乎g ++ 4.0对此有共同的看法,因为它接受了这个代码.然而,更新的g ++ 4.5(.2)拒绝带有消息的代码:

ns.cc: In function 'void foo(std::ostream&)':
ns.cc:14:10: error: no match for 'operator<<' in 'out << bar'
Run Code Online (Sandbox Code Playgroud)

是g ++ 4.5错了还是我(和g ++ 4.0)错了?

(将朋友声明移入F课堂的解决方案没有帮助,因为operator<<需要访问私人部分N.)

此致,斯特凡

Let*_*_Be 5

问题是,除非您提供内联实现,否则友元声明不提供全局函数声明.

struct N {
   friend void func1() { }
   friend void func2();
   friend void func3();
};

void func3();

func1(); /* OK */
func2(); /* not OK */
func3(); /* OK */
Run Code Online (Sandbox Code Playgroud)