Можно создать дубликат:
Priority when choosing overloaded template functions in C++C++ разрешение перегрузки функции относительно шаблонного типа и иерархии классов
шаблонного функция дает мне удобство для работы на различных типах:
template<typename T> void destroy(T* obj) {
delete obj;
}
Но в какой-то момент я хочу сделать некоторую специализацию в иерархии классов у:
class Base { virtual void doSomething(); };
class Derived : public Base {};
void destroy(Base* obj) {
obj->doSomething();
delete obj;
}
Желаемая специализированная функция сделала вызывается, если я пропуск точного типа Base*
, однако правила разрешения перегрузки, кажется, предпочитает общую шаблонную версию вместо выполнения статического вверх бросок, если я пас Derived*
в void detroy()
.
Конечно, я могу сделать все перегруженные функции для всех возможных производных типов, но он менее обслуживаем.
Я использую Visual C++ 2008, есть ли какой-либо путь вокруг вышеупомянутой проблемы?
Только что нашел аккуратный ответ на ту же проблему в переполнении стека: [Приоритет при выборе перегруженных функций шаблона в C++] (http://stackoverflow.com/questions/1332678/priority-when-choosing-overloaded-template-functions -in-c) –
Однако ваша функция уничтожения имеет проблемы. Он также будет вызываться для типа массива 1D, и вы можете приземлиться на «delete» вместо «delete []», что является неопределенным поведением. – Chubsdad
Op допускает, что Q должен быть закрыт как дубликат. –