天儿真好!
我有一个关于在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;
}
我的理解总是如此,那个朋友类似于static,其友元函数可以访问类的私有部分.在该假设下,代码应该编译,因为存在运算符<<需要一个ostream&和(const)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'
是g 4.5错了还是我(和g 4.0)错了?
(将友元声明移动到F类的解决方案没有帮助,因为运算符<<将需要访问N的私有部分.)
问候,
斯特凡
解决方法:
您还必须在结构外部声明运算符. gcc 4.4报告了相同的错误.
#include <ostream>
struct F {
};
struct N {
friend std::ostream& operator<< (std::ostream&, const N&);
friend std::ostream& operator<< (std::ostream&, const F&);
};
std::ostream& operator<< (std::ostream&, const N&);
std::ostream& operator<< (std::ostream&, const F&);
void foo(std::ostream &out) {
F bar;
out << bar;
}