我试图从朋友类访问私有静态方法但是收到LINK错误。访问任何其他privte非静态成员和方法工作正常。
注意:对于一般未解析的符号,此问题不(DLL确实包含实现,我们确实与其库链接)。符号DOES存在于DLL中,但它被公开为私有' (如果我在dependency-walker中检查它),而链接器正在寻找公共' (如果我检查链接器报告的装饰名称)。我认为问题在于链接器在尝试解析私有静态方法时似乎忽略了友谊。
e.g:
class CA
{
friend class CMyFriend;
private:
static void TestedFunc();
};
class CMyFriend
{
public:
static void Tester()
{
CA::TestedFunc();
}
};
答案 0 :(得分:1)
这可能是一个难题,但您可以稍微重新设计一下类以使用私有静态代理对象和公共方法:
标题强>
class CA
{
friend class CMyFriend;
private:
class CAProxy final {
friend class CA;
private:
CAProxy(){}
};
static CAProxy proxy;
static void TestedFunc();
public:
static void TestedFunc(const CAProxy& proxy); // This just calls TestedFunc();
};
<强>实施强>
CA::CAProxy CA::proxy{};
void CA::TestedFunc(const CAProxy& proxy) {
TestedFunc();
}
void CA::TestedFunc() {
// your code...
}
<强>呼叫者强>
class CMyFriend
{
public:
static void Tester()
{
CA::TestedFunc(CA::proxy); // This will call the public method
}
};
因为公共方法需要对除CA
本身之外的任何人都无法实例化的对象的引用,并且因为静态实例CA::proxy
是私有的并且只有朋友可以访问,所以只有朋友才能调用此方法公共方法。