定义流IO的友元函数很常见,但随着项目变大,一般都将将类定义在某命名空间内,这时,我们在该类中定义的友元函数和命名空间是什么关系?如果该友元函数在类的cpp文件中实现,是放在命名空间内还是放在命名空间外?另外,对于该实现的函数,是否还需要给出函数声明?也就是说,friend能否承担声明友元函数的责任?
头文件:
#include <ostream>
namespace ns_test
{
/*
* type
*/
class CTestFriend
{
public:
CTestFriend(int i):
m_int(i)
{
// TODO Auto-generated constructor stub
}
virtual ~CTestFriend();
friend std::ostream & operator << (std::ostream & os, const CTestFriend & obj);
private:
int m_int;
};
} /* namespace ns_test */
CPP文件
#include "CTestFriend.h"
namespace ns_test
{
CTestFriend::~CTestFriend()
{
// TODO Auto-generated destructor stub
}
std::ostream & operator << (std::ostream & os, const CTestFriend & obj)
{
os << obj.m_int << "\n";
return os;
}
} /* namespace ns_test */
上述代码,在实际的测试中,友元函数实现必须在命名空间内,并且friend已经承

本文探讨了在C++中,当类位于命名空间内时,如何处理友元函数,特别是流IO操作符的问题。内容包括:友元函数是否必须在命名空间内实现,friend关键字是否能替代函数声明,以及全局命名空间下重载流运算符的正确做法。实验环境为gcc 4.6.3,建议读者在其他编译器上验证。
最低0.47元/天 解锁文章
945

被折叠的 条评论
为什么被折叠?



