友元函数问题

[复制链接]
1309|4
 楼主| sinadz 发表于 2013-6-29 12:38 | 显示全部楼层 |阅读模式
#include <iostream>

using namespace std;

namespace Test{
    class A{
    public:
        friend void TestFn1(const A &a){};
    };
    void TestFn2(const A &a){};
}
class B{
public:
    operator Test::A(){return Test::A();}
};
using namespace Test;
void TestFn3(const A &a){}

void main(){
    B obj;
    TestFn1(obj);
    TestFn2(obj);//不需要通过对象调用,因为有using namespace Test;
    TestFn3(obj);
}
问题What does “operator Test::A()” mean? TestFn1(obj) can’t get through the compiling,but TestFn2(obj) and TestFn3(obj) can,why?
 楼主| sinadz 发表于 2013-6-29 12:44 | 显示全部楼层
operator Test::A() 定义了一个转型的操作符. 在 B b; (Test::A)b 的时候调用.
friend 是加在声明前面的, 加在函数定义前还真没见过.
baidudz 发表于 2013-6-29 12:47 | 显示全部楼层
友员这么用是为了实现啥目的
无冕之王 发表于 2013-6-29 13:07 | 显示全部楼层
友元函数本来就可以写在类内部,就跟成员函数可以在类内声明类外定义也可以直接在类内定义一样
友元函数也可以类内声明类外定义也可以直接在类内部定义
txcy 发表于 2013-6-29 13:12 | 显示全部楼层
类中定义的友元函数,类外部是可见的,定义在名空间内部的类中,在名空间中是可见的,使用using namespace开放名空间到全局名空间中后,在名空间可见的,全局名空间,也应该是可见的,
所以名空间中类中定义的友元函数,开放名空间到全局名空间中后,应该在全局名空间可见。
而这里所这个函数有问题,不能编译,显然是VC的一个BUG,应该不是标准。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

304

主题

2313

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部