2014-06-09 4 views
2

Что здесь происходит - почему это не скомпилировано?Компилятор не может найти метод базового класса ADL

#include <iostream> 
class Base { 
    void print(double d) { 
     std::cout << "Base: " << d << std::endl; 
    } 
}; 

class Derived : public Base { 
void print(std::string const & str) { 
     std::cout << "Derived: " << str << std::endl; 
    } 
}; 

int main(int argc, char* argv[]) { 
    Derived d; 
    d.print(2.); 
    d.print("junk"); 
} 

(Ошибки в обоих MinGW и VC11 с чем-то эквивалентным No conversion from double to std::string.)

Если изменить имя функции печати в Derived, он успешно компилируется, так ясно Derived::print(string const &) маскирует Base::print(double) каким-то образом. Но у меня создалось впечатление, что подпись функции включала тип (ы) аргумента, и поэтому эта маскировка должна происходить здесь. Это неверно в случае методов базового класса?

+2

Это не имеет никакого отношения к ADL, что совсем другое. –

ответ

3

Нет, это не правильно: имя скрытие происходит, когда функция с тем же именем объявлена ​​в том же объеме: здесь print в Derivedшкур в print из Base.

Имена/типы аргументов игнорируются в этом (первом) шаге поиска функций.

Вы можете принести объявление функции базы в Derived один с using декларации:

using Base::print 

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

Для получения дополнительной информации о почему скрытие происходит в этой исходной/базовой ситуации, я предлагаю this other SO post, который отлично отвечает на него.

Что касается стандарта, это конкретное правило определено в разделе 3.3.1:

Имя скрывается [basic.scope.hiding]

Имя может быть скрыто явного объявления того же имени в вложенном декларативном регионе или производном классе (10.2).

+0

Также в другом сообщении SO (далее вниз) http://stackoverflow.com/a/1628786/1821972 показывает, как можно было бы поставить класс Derived: public Base {using Base :: print; ...}, чтобы получить то, что вы изначально ожидали. Отличный учебник p.901-904 в http://www.amazon.com/Primer-3rd-Edition-Stanley-Lippman/dp/0201824701 –

+0

@Joe: да, отредактировано с помощью объявления «using» – quantdev