天儿真好!
我有一个关于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.)
此致,斯特凡
问题是,除非您提供内联实现,否则友元声明不提供全局函数声明.
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)