У меня есть функция шаблона, который явно создан для Base
класс, но не для Derived
учебный класс. Как я могу заставить использования, которые передают Derived
класс (или другие производные классы) для сопоставления с Base
учебный класс?
Заголовочный файл:
class Base {
};
class Derived : public Base {
};
class Derived2 : public Base {
};
template <typename Example> void function(Example &arg);
Файл реализации:
// Explicitly instantiate Base class:
template void function<Base>(Base &arg);
// Define the template function:
template <typename Example> void function(Example &arg) {
// Do something.
}
Потому что у меня нет явно созданной функции для Derived
или же Derived2
Я получаю неопределенные ссылки, однако я хотел бы связать с Base
класс, который явно определен.
Как я могу заставить шаблон преобразоваться в базовый класс для всех объектов, полученных из Base с использованием C ++ — 03?
Могу ли я сделать это как-то со специализацией Derived
класс к Base
определение класса?
Как насчет:
template <> void function(Derived &arg)
{
function<Base>( arg );
}
РЕДАКТИРОВАТЬ: Вы также можете сделать это с перегрузкой функции, как aschepler предложил:
void function(Derived &arg)
{
function<Base>( arg );
}
Концептуально то же самое, хотя, я согласен, немного лучше 🙂
Других решений пока нет …