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

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

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)。