Функция с несколькими сигнатурами пытается вызвать закрытый подкласс вместо более общей функции - PullRequest
3 голосов
/ 27 марта 2012

Рассказ:

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

void f(void *){}

void f(A*){}

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

и GCC жалуется ошибка: «A» - недоступная база «B»

Длинная история: Чтобы увидеть, является ли класс подклассом (или таким же) другого без использования 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 * версию?

1 Ответ

2 голосов
/ 27 марта 2012

Это связано с процессом разрешения перегрузки и с тем, как он работает.Когда вы передаете указатель на производный объект, компилятор попытается найти наилучшее совпадение для функции и определит, что именно перегрузка переводит указатель на A.Только после этого проверяются спецификаторы доступа, и компилятор жалуется, что A не является доступной базой из этого контекста.

Компилятору не разрешено возвращаться назад, отбрасывать эту перегрузку и пробовать с остальными.

...