Список аргументов для шаблона класса «calc» отсутствует - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь изменить класс «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 ]

0 голосов
/ 28 ноября 2018

является языком со строгой типизацией, что означает, что вы должны полностью указать все типы при объявлении.Если calc является шаблоном, вы не можете объявить: calc c, так как это не полностью указывает тип.Вы должны указать, что параметр шаблона calc должен быть полностью указан, например:

calc<double> c

Ответ TonyK уже полностью охватывает это.Я пишу это, чтобы прокомментировать, что вы заново изобретаете колесо.Функциональность, которую вы пишете, уже доступна в виде:

  • plus для добавления
  • multiplies дляделайте умножение

И это не требует класса.Так что даже если что-то вроде: cout << 1 * 5 не соответствует вашим потребностям, и вам нужно было выполнить это в форме вызова функции, создав объект функтора:

multiplies<double> foo;

cout << foo(1, 5);

Live Example

0 голосов
/ 28 ноября 2018

Как компилятор может узнать, какой calc вы хотите?Вы должны сказать это:

calc<int> c;

или

calc<double> c;

или ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...