定义在类中的友元函数的访问权限?该怎么解决
定义在类中的友元函数的访问权限?
编译器会报错:
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中,或者把友元函数的定义放在类申请之外,就可以编译成功
但不清楚具体原因,还请高手赐教,谢谢。
------解决方案--------------------
前几天解答过一个类似的问题。
可参考:友元函数体实现在类内和实现在类外的区别?
当把友元函数的定义放在类域中时,实参的类型所在的域和名称空间也加入到名字搜索域中,所以后两种方法合法,第一种方法非法(因为类B中没有TestFn1)。
- 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)。