Список аргументов для шаблона класса "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);

Живой пример

Другие вопросы по тегам