Функция-член класса шаблона

У меня есть класс под названием Time, Есть только два частных члена: int hours а также int minutes, Спецификатор публичного доступа содержит только такие функции, как сложение, вычитание и т. Д.

Но есть особая функция, которая не ведет себя так, как я хочу. Объявлено public в классе.

Таким образом, он компилирует:

Time Time::operator*(const int &mult)
{
minutes = minutes*mult;
hours = hours*mult + minutes/60;
minutes %= 60;
return *this;
}

Но что, если аргумент не на int, но float, или же double? Я полагаю, что использование шаблонов — лучший вариант, а не перегрузка функции:

template <class T> Time Time::operator*(const T &mult)
{
minutes = int(minutes*mult);
hours = int(hours*mult) + minutes/60;
minutes %= 60;
return *this;
}

Тем не менее, написание этого пути приводит к ошибке компиляции:

error LNK2019: unresolved external symbol "public: class Time __thiscall Time::operator*<int>(int const &) " (??$?DH@Time@@QBE?AV0@ABH@Z) referenced in function _main

Это означает, что я не могу использовать перегрузку операторов шаблонами или как?

Спасибо
Роберт

1

Решение

Шаблоны похожи на шаблоны для функции. Они должны быть инстанцирован прежде чем использовать их. Для вашего примера вам нужно создать экземпляр Time :: operator * с T = int, который получается заменой каждого T в вашей функции на int,

Есть два способа, которыми это может произойти:

Во-первых, есть явная реализация, где вы должны создать экземпляр шаблона для всех типов, на которых вы хотите его использовать. Явная реализация вашего оператора * для T = int выглядит следующим образом:

template Time Time::operator*<int>(const int &mult);

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

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

Таким образом, у вас есть два варианта: либо добавить явное создание экземпляра для int в файл реализации, либо переместить реализацию шаблона в файл заголовка.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]