【问题标题】:error on private inheritance and function overloading私有继承和函数重载错误
【发布时间】:2012-11-08 18:38:42
【问题描述】:

我有一个问题,我缩小到以下代码:

class A
{
};

class B : private A
{
};

void f(A*)
{
}

void f(void*)
{
}

int main()
{
  B b;
  f(&b);
}

gcc 4.7 出现以下错误:

error: ‘A’ is an inaccessible base of ‘B’

我知道 A 不可访问,但我希望编译器调用 f(void*)。这种行为是正常的还是我做错了什么?或者可能是编译器错误?

【问题讨论】:

    标签: c++


    【解决方案1】:

    重载在访问检查之前解决。所以编译器选择f(A*)作为合适的重载,然后判断&b不能转换为A*并给出错误信息。

    【讨论】:

    • 至于为什么会这样:因为会导致这样的错误。因此,如果您想防止人们意外调用f(void*),您现在知道如何调用了,如果他们仍然想调用它,他们只需投射f(static_cast<void*>(&b));
    • 我明白了,这是有道理的,虽然我对此有点失望。
    【解决方案2】:

    您需要确保b 作为void * 传入,这不是默认情况,因为b 实际上是A 的一个实例。只需通过强制转换明确告诉f() bvoid *

    class A {
    };
    
    class B : private A {
    };
    
    void f(A*) {
    }
    
    void f(void*) {
    }
    
    int main() {
      B b;
      f((void*)&b);
    }
    

    【讨论】:

    • 这确实可以解决问题,但就我而言,我无法访问 f 调用,我只能更改 A 类和 B 类。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2011-10-30
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多