У меня есть класс Calculator<T>
и класс LoggingCalculator<T>
, который наследуется от Calculator<T>
.Calculator<T>
имеет виртуальные методы, такие как add
, multiply
и т. Д. В дочернем классе LoggingCalculator<T>
я пытаюсь переопределить эти методы.Я уже переопределил метод add
, хорошо.Но я не могу переопределить multiply
, потому что компилятор говорит:
Calculator :: Calculator [int] :: Calculator (void) ': нет подходящего определения для явного запроса на создание экземпляра шаблона
хотя я явно создал свои шаблоны.Я действительно не понимаю, , почему эта ошибка возникает при переопределении multiply
метода, в то время как add
прекрасно компилирует .
Действительно странная вещь в том, что делает скомпилируйте, если я не верну универсальное значение, возвращаемое методом базового класса.Но если вы хотите вернуть результат из метода базового класса, он не компилируется.См. LoggingCalculator.cpp
код ниже.
Calculator.h:
template <class T>
class Calculator
{
public:
Calculator();
~Calculator();
virtual T add(T a, T b);
virtual T multiply(T a, T b);
}
template class Calculator<int>;
template class Calculator<long>;
template class Calculator<float>;
template class Calculator<double>;
Calculator.cpp:
template<class T>
Calculator<T>::Calculator() {}
template<class T>
Calculator<T>::~Calculator() {}
template<class T>
T Calculator<T>::add(T a, T b)
{
return a + b;
}
template<class T>
T Calculator<T>::multiply(T a, T b)
{
return a * b;
}
LoggingCalculator.h:
template <class T>
class LoggingCalculator : public Calculator<T>
{
public:
LoggingCalculator();
~LoggingCalculator();
T add(T a, T b) override;
T multiply(T a, T b) override;
};
template class LoggingCalculator<int>;
template class LoggingCalculator<long>;
template class LoggingCalculator<float>;
template class LoggingCalculator<double>;
LoggingCalculator.cpp:
template<class T>
LoggingCalculator<T>::LoggingCalculator() { }
template<class T>
LoggingCalculator<T>::~LoggingCalculator() {}
template<class T>
T LoggingCalculator<T>::add(T a, T b)
{
T result = Calculator<T>::add(a, b);
return result;
}
template<class T>
T LoggingCalculator<T>::multiply(T a, T b)
{
T result = Calculator<T>::multiply(a, b);
//return a * b; // COMPILES FINE!
return result // CAUSES ERROR
}