我最近遇到了第三方库的问题,它从xml生成类。以下是它的要点:
class B;
class A
{
void doSomething();
friend class B;
};
class B
{
void doSomething();
void doSomethingMore()
{
doSomething();
}
};
编译器标志对函数doSomething()
的调用是不明确的,并将其标记为编译器错误。很容易理解为什么它会出错。Class B
成为class A
的朋友,class B
的每个成员都可以访问class A
的所有成员。重命名这两个函数解决了我的问题,但它让我觉得不应该在这种情况下编译器应该优先考虑类的自己的成员函数优先于另一个类中的函数吗?
注意:我将在明天更新编译器版本详细信息。需要检查工作场所的确切版本详细信息。我想我应该把它们放在第一位...... :(
[问题更新&分辨率]
我用一个小样本程序再次检查了我的坏问题不是由于朋友功能导致的歧义。第三方库在内部生成具有相同签名的函数,并且在同一类中导致模糊。谢谢你的回复,至少我的误解得到了纠正:)
答案 0 :(得分:3)
没有歧义。在A中调用的函数需要A实例。 B中调用的函数需要B实例。
在B实例上调用doSomethingMore,因此被调用的函数是B中的函数。
你好像误解了友谊。所有这意味着,在这种情况下,给定A的实例,B的成员函数可以调用A :: doSomething()函数或在具有私有访问权限的A中执行任何其他操作。答案 1 :(得分:0)
你的例子中绝对没有含糊之处。制作另一个类的朋友对你所描述的名称查找没有这样的影响。 "这很容易理解......"从语言的角度来看,解释并没有多大意义。
虽然破碎的编译器可能会按照您描述的方式运行,但很可能您错过了某些内容,并且模糊性的原因也不同。