c++基础问题

zhangyu21101213 2008-12-19 10:01:59
书上有这样的话:名字空间中类的友元函数,即使该友元没有直接被声明在名字空间中,在该名字空间中用普通方法也找不到该友元

我的问题是,如果友元没有在名字空间中声明,那么它就被名字空间名字解析,还是其他方法找到该名字?
...全文
157 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyu21101213 2008-12-19
  • 打赏
  • 举报
回复
我想问,如果在名字空间中没有声明友元函数,只在名字空间的类中声明了这个友元,那么这个友元声明,就相当于这个函数的声明吗?
wiowei 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wiowei 的回复:]
引用 7 楼 zhangyu21101213 的回复:

我只是想知道,友元的名字解析过程,他在类中的友元声明,可以在类外,名字空间内找不到,这个是我不理解的地方

就算在类外,也要加域符号限制的,实际上还是在名字空间内
[/Quote]
如4L的例子:void Mynamespace::print(const A &obj){}
如果你把域限制 Mynamespace::去掉则link时会找不到函数体。
函数定义(实现)要和类在同一名字空间内,不用::的话就只能放到同一名字空间内
wiowei 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhangyu21101213 的回复:]
我只是想知道,友元的名字解析过程,他在类中的友元声明,可以在类外,名字空间内找不到,这个是我不理解的地方
[/Quote]
就算在类外,也要加域符号限制的,实际上还是在名字空间内
SearchLife 2008-12-19
  • 打赏
  • 举报
回复
up
shexinwei 2008-12-19
  • 打赏
  • 举报
回复
up!!jf
zhangyu21101213 2008-12-19
  • 打赏
  • 举报
回复
我只是想知道,友元的名字解析过程,他在类中的友元声明,可以在类外,名字空间内找不到,这个是我不理解的地方
wiowei 2008-12-19
  • 打赏
  • 举报
回复
搞不懂lz的意思。
既然用了名字空间,你的友元函数要在类中声明,函数定义体也要在名字空间域内,用域符号::限制。跟类成员函数定义方式不是一样吗?
zhangyu21101213 2008-12-19
  • 打赏
  • 举报
回复
在名字空间中的类中声明了友元,但在名字空间里找不到它的生命,那如何进行名字解析?你的例子上把PRINT的定义放在名字空间外,那它在类中的友元就是它的声明吗?
wangdeqie 2008-12-19
  • 打赏
  • 举报
回复

#include <cstdlib>
#include <iostream>

using namespace std;
//声明了友元,同时也在这个类及命名空间里申明了这个函数
namespace Mynamespace
{
class A
{
friend void print(const A &obj);
public:
void f(){print(*this);}
private:
int num;
};
}

void Mynamespace::print(const A &obj){}

int main(int argc, char *argv[])
{
system("PAUSE");
return EXIT_SUCCESS;
}

xiaoyisnail 2008-12-19
  • 打赏
  • 举报
回复
可以在一个名字空间的类定义之内插入一个友元声明:

namespace Me{
class Us{
//...
friend void you();
};
}

这样函数you()就成了名字空间Me的一个成员。

参见《C++编程思想》第一卷(第二版)10.2.1.2
zhangyu21101213 2008-12-19
  • 打赏
  • 举报
回复
来看看啊
liubuweiright 2008-12-19
  • 打赏
  • 举报
回复
up
zhangyu21101213 2008-12-19
  • 打赏
  • 举报
回复
是这样啊,谢谢了!
xxgamexx 2008-12-19
  • 打赏
  • 举报
回复

#include <cstdlib>
#include <iostream>

using namespace std;
//声明了友元,同时也在这个类及命名空间里申明了这个函数
namespace Mynamespace
{//作用域
class A
{
friend void print(const A &obj);
public:
void f(){print(*this);}
private:
int num;
};
void print(const A &obj){}
}//end namespace


int main(int argc, char *argv[])
{
system("PAUSE");
return EXIT_SUCCESS;
}



wiowei 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhangyu21101213 的回复:]
我想问,如果在名字空间中没有声明友元函数,只在名字空间的类中声明了这个友元,那么这个友元声明,就相当于这个函数的声明吗?
[/Quote]
搞了半天是这个。是呀,声明了一个友元,则这个友元也就成了名字空间的一个成员。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧