Определение класса имени типа шаблона С++

Мне дали задание сделать «калькулятор» на С++, который принимает любой числовой тип данных в качестве двух входных данных, вычисляет либо сумму, либо произведение, а затем регистрирует уравнение. Все это с помощью template <typename T>. Мне трудно найти документацию по моим конкретным проблемам, а именно:

  • Как настроить функции и конструкторы с определенным типом возвращаемого значения.
  • Как эффективно искать журнал ошибок C++, чтобы я мог исправлять ошибки так же легко, как и в «C».

Мой файл .hpp:

#pragma once

#include <sstream>
#include "logger.hpp"

template <typename T>
class Calculator{
    public:
        Calculator(Logger *l);

        T sum(T a, T b);

        T multiply(T a, T b);

    private:
        Logger *logger;
};

Мой файл .cpp:

#include "template_calculator.hpp"

Calculator::Calculator(Logger *l){
    logger = l;
}


Calculator::T sum(T a, T b){
    T c = a + b;
    std::string str_a = std::to_string(a);
    std::string str_b = std::to_string(b);
    std::string str_c = std::to_string(c);
    logger->log(str_a + " + " + str_b + " = " + str_c);
    return c;
}


Calculator::T multiply(T a, T b){
    T c = a * b;
    std::string str_a = std::to_string(a);
    std::string str_b = std::to_string(b);
    std::string str_c = std::to_string(c);
    logger->log(str_a + " * " + str_b + " = " + str_c);
    return c;
}

Я пытался следовать указаниям этого парня: недопустимое использование имя шаблона без списка аргументов

.. но это не решает моих проблем. Я получаю следующие ошибки, все из которых я не могу найти.

note: ‘template<class T> class Calculator’ declared here
7 | class Calculator{

error: invalid use of template-name ‘Calculator’ without an argument list
8 | Calculator::T sum(T a, T b){

Попытка воспользоваться советом по ссылке выше:

    #include "template_calculator.hpp"

    template <typename T>
    Calculator<T>::Calculator(Logger *l){
        logger = l;
    }


    Calculator<T>::T sum(T a, T b){
        T c = a + b;
        std::string str_a = std::to_string(a);
        std::string str_b = std::to_string(b);
        std::string str_c = std::to_string(c);
        logger->log(str_a + " + " + str_b + " = " + str_c);
        return c;
    }


    Calculator<T>::T multiply(T a, T b){
        T c = a * b;
        std::string str_a = std::to_string(a);
        std::string str_b = std::to_string(b);
        std::string str_c = std::to_string(c);
        logger->log(str_a + " * " + str_b + " = " + str_c);
        return c;
    }

согласно:

    template<typename T>
LinkedList<T>::LinkedList()
{
   start = nullptr;
   current = nullptr;
}

И аналогично для других функций-членов.


person Jens Dissing Poulsen    schedule 19.02.2020    source источник
comment
См. этот связанный вопрос.   -  person 1201ProgramAlarm    schedule 20.02.2020
comment
Я уже видел и читал этот конкретный пост, но выполнение объяснений не приводит к компиляции кода.   -  person Jens Dissing Poulsen    schedule 20.02.2020
comment
Я пытался следовать указаниям этого парня: [...] но это не решает моих проблем.: Это должно решить вашу проблему. Пожалуйста, покажите, как вы пытались применить ответ на этот вопрос к своему коду, а затем покажите полученную ошибку. Кроме того, учтите, что в определениях ваших функций в .cpp отсутствуют возвращаемые типы в заголовке функции....   -  person walnut    schedule 20.02.2020
comment
Кроме того, учтите, что в определениях ваших функций в .cpp отсутствуют возвращаемые типы в заголовке их функций.... Это мне известно, но добавление чего-либо приводит к тому, что он жалуется, что «T» не определен.   -  person Jens Dissing Poulsen    schedule 20.02.2020
comment
By И аналогично для других функций-членов. Подразумевается ли, что шаблон ‹typename T› должен быть написан для каждой функции?   -  person Jens Dissing Poulsen    schedule 20.02.2020