2

喜欢这段代码

class Try
{
public:
    Try() = default;
    int i = 0;
};

class B1 : private Try
{
public:
    B1() = default;
    using Try::Try();
    using Try::i;
};

class C1 : public B1
{
public:
    Try a; //tell me:'Try' is a private member of 'Try'
    
    void print()
    {std::cout << i << std::endl;}
    //Access to this I is allowed;
};

Try a 是本地对象,不是 C1 的一部分,为什么会出错?

只要是私有继承的直接基类,就不能在其派生类中定义间接基类对象吗?是因为无法使用构造函数还是其他原因?

4

1 回答 1

3

Try a 是本地对象,不是 C1 的一部分,为什么会出错?

Try a;通过在 class 的上下文中编写C1,名称查找通常总是从本地范围扫描到全局范围。因此,第一个匹配项将是B1::Try,即由于私有继承,对于 是不可访问的C1

修复很简单,只需向编译器提示您“真正”表示的名称,即编写 eg ::Try a;

于 2021-01-07T10:03:00.763 回答