C ++:如何防止私有名称污染派生类型?

问题描述 投票:3回答:1

今天我对这个代码段的名称参考含糊不清感到震惊:

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类。这是否意味着您在不破坏他人代码的情况下就不能在新类中使用任何新的名称(甚至是私有名称)?

这里的约定是什么?

c++ inheritance private base ambiguity
1个回答
0
投票

首先执行名称查找和名称解析。

D类中,可以从TypeA中找到名称B,并且名称不明确,编译器不知道应使用哪个名称,并且编译失败。辅助功能检查将在稍后执行(在这种情况下尚未执行)。

例如,您可以在B::Type中指定要使用D。>

class D : A, B
{
    B::Type value;
};

class D : A, B
{
    using B::Type;
    Type value;
};

这不是意味着您不能在不破坏他人代码的情况下在新类中使用任何新的(甚至是私有的)名称?

公约。作为作者,您不应在一个类中声明public名称,而在其他类中声明名称相同但意图不同的private名称。另外,您可能会制定一些规则,保留某些名称,这些名称不应在客户端中使用。

© www.soinside.com 2019 - 2024. All rights reserved.