今天我对这个代码段的名称参考含糊不清感到震惊:
class A
{
private:
typedef int Type;
};
class B
{
public:
typedef int Type;
};
class D : A, B
{
Type value;//error: reference to 'Type' is ambiguous
};
嗯!假设您是A
类的作者,并且您的类已经被不同的人和不同的项目所使用。有一天,您决定重写您的A
类。这是否意味着您在不破坏他人代码的情况下就不能在新类中使用任何新的名称(甚至是私有名称)?
这里的约定是什么?
首先执行名称查找和名称解析。
在D
类中,可以从Type
和A
中找到名称B
,并且名称不明确,编译器不知道应使用哪个名称,并且编译失败。辅助功能检查将在稍后执行(在这种情况下尚未执行)。
例如,您可以在B::Type
中指定要使用D
。>
class D : A, B { B::Type value; };
或
class D : A, B { using B::Type; Type value; };
这不是意味着您不能在不破坏他人代码的情况下在新类中使用任何新的(甚至是私有的)名称?
公约。作为作者,您不应在一个类中声明public
名称,而在其他类中声明名称相同但意图不同的private
名称。另外,您可能会制定一些规则,保留某些名称,这些名称不应在客户端中使用。