Почему компилятор выбирает эту шаблонную функцию вместо перегруженной не шаблонной функции?

Используя VC ++ 2010, учитывая следующее:

class Base { };
class Derived : public Base { };

template<class T> void foo(T& t);  // A
void foo(Base& base);              // B

Derived d;
foo(d);                            // calls A
foo(static_cast<Base&>(d));        // calls B

Я бы хотел, чтобы выше вызывался "B". Я могу добиться этого с помощью преобразования в Base , но зачем это нужно?

Я хочу, чтобы функция шаблона вызывалась для всех типов, не производных от Base (встроенный типы и т. д.), но я хочу, чтобы не-шаблонная перегрузка вызывалась для типов, производных от Base , не требуя от клиента явного приведения типов. Я также попытался сделать перегрузку специализацией шаблона, но в этом случае происходит то же самое. Какой идиоматический способ получить то, что я ищу?

10
задан curiousguy 24 December 2011 в 06:35
поделиться