2012-11-08 46 views
3

我有我缩小到下面的代码中的问题:错误的私有继承和函数重载

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’ 

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

回答

4

超载已解决之前访问检查。所以编译器选择f(A*)作为适当的过载,然后确定&b不能转换为A*并给出错误消息。

+0

至于为什么是这样:* *,因为它会导致这样的错误。所以,如果你想防止人们不小心调用'f(void *)',你现在知道如何,如果他们仍然想调用它,他们可以只投'f(static_cast (&b));'。 –

+0

我看,这是有道理的,但我有点失望。 – Philippe

0

您需要确保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); 
} 
+0

这确实可以解决问题,但在我的情况下,我没有访问f调用,我只能改变类A和B. – Philippe