Список аргументов для шаблона класса "calc" отсутствует
Я пытаюсь изменить класс "calc", чтобы он был более универсальным, чтобы он также принимал удваивающие или плавающие числа.
class calc {
public:
int multiply(int x, int y);
int add(int x, int y);
};
int calc::multiply(int k1, int k2)
{
return k1 * k2;
}
int calc::add(int k1, int k2)
{
return k1 + k2;
}
Это моя реализация ниже, но у меня ошибка E0441: отсутствует список аргументов для шаблона класса "calc" (строка: calc c;).
template < class T>
class calc
{
public:
T multiply(T x, T y);
T add (T x, T y);
};
template < class T>
T calc<T>::multiply(T k1, T k2)
{
return k1 * k2;
}
template < class T>
T calc<T>::add(T k1, T k2)
{
return k1 + k2;
}
int main()
{
calc c;
std::cout << c.multiply(1, 5);
}
Как мне преобразовать класс в шаблонный класс и функцию?
2 ответа
Как компилятору узнать, что это за calc
ты хочешь? Вы должны сказать это:
calc<int> c;
или же
calc<double> c;
или же...
C++ является строго типизированным языком, это означает, что вы должны полностью указать все типы при объявлении. Если calc
является шаблонным, вы не можете объявить: calc c
поскольку это не полностью указывает тип. Вы должны предоставить параметр шаблона calc
требует полного указания, например:
calc<double> c
Ответ TonyK уже полностью покрывает это все же. Я пишу это, чтобы прокомментировать, что вы заново изобретаете колесо. Функциональность, которую вы пишете, уже доступна в виде:
plus
сделать дополнениеmultiplies
делать умножение
И это не требует класса. Так что даже если что-то вроде cout << 1 * 5
не соответствует вашим потребностям, и вам нужно было выполнить это в виде вызова функции путем создания объекта функтора:
multiplies<double> foo;
cout << foo(1, 5);