3

短篇故事:

struct A{};
struct B:private A{};

void f(void *){}

void f(A*){}

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

并且 GCC 报错:'A' is an inaccessible base of 'B'</p>

长话短说:要查看一个类是否是另一个类的子类(或相同)而不使用 boost,我会

template<typename B,typename D> struct is_base_or_same_of{

 typedef char (&yes)[2] ;  

 static yes test(const B* b);
 static char test(const void* p);

 static const D* d();

 static const bool value=sizeof(test(d()))==sizeof(yes);

};

情况是一样的

我怎样才能让编译器“更喜欢” void* 版本?

4

1 回答 1

2

这与重载解决的过程及其进行方式有关。当您将指针传递给派生对象时,编译器将尝试找到函数的最佳匹配,并确定它是采用指向A. 只有这样访问说明符才会被检查,并且编译器会抱怨这A不是该上下文中的可访问基础。

不允许编译器返回,丢弃该重载并尝试其余的重载。

于 2012-03-27T16:56:27.693 回答