读书人

定义在类中的友元函数的访问权限?该怎

发布时间: 2012-06-16 20:34:32 作者: rapoo

定义在类中的友元函数的访问权限?

C/C++ code
#include "stdafx.h"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){};int _tmain(int argc, _TCHAR* argv[]){    B obj;    TestFn1(obj);    TestFn2(obj);    TestFn3(obj);    return 0;}


编译器会报错:
1>c:\documents and settings\administrator\my documents\visual studio 2008\projects\bb\bb\bb.cpp(34) : error C3767: “TestFn1”: 候选函数不可访问
1> 可能是位于“c:\documents and settings\administrator\my documents\visual studio 2008\projects\bb\bb\bb.cpp(11)”的友元函数:“TestFn1”[可以通过参数相关的查找找到]

分析原因:可能与友元函数在类中定义、及名称空间相关,
因为按照下面2种方法分别把整个Class B移到namespace Test中,或者把友元函数的定义放在类申请之外,就可以编译成功
C/C++ code
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();        };    };    };

C/C++ code
namespace Test{    class A    {    public:        friend void TestFn1(const A &a);    };    void TestFn1(const A &a){};    void TestFn2(const A &a){};};


但不清楚具体原因,还请高手赐教,谢谢。

[解决办法]
前几天解答过一个类似的问题。

可参考:友元函数体实现在类内和实现在类外的区别?

当把友元函数的定义放在类域中时,实参的类型所在的域和名称空间也加入到名字搜索域中,所以后两种方法合法,第一种方法非法(因为类B中没有TestFn1)。

读书人网 >C++

热点推荐