【发布时间】:2018-11-05 16:14:07
【问题描述】:
我有一个Calculator<T> 类和一个LoggingCalculator<T> 类,它继承自Calculator<T>。 Calculator<T> 有一个虚拟方法,如add、multiply 等。在子类LoggingCalculator<T> 中,我试图覆盖这些方法。我已经覆盖了add 方法,很好。但我不能覆盖multiply,因为编译器说:
Calculator::Calculator[int]::Calculator(void)': 没有为显式模板实例化请求提供合适的定义
尽管如此,我还是明确地实例化了我的模板。我真的不明白,为什么在覆盖 multiply 方法时会发生此错误,而 add 编译良好strong>。
真正奇怪的是它确实编译,如果我不返回从基类方法返回的泛型值。但是如果想从基类方法返回结果,它不会编译。请参阅下面的LoggingCalculator.cpp 代码。
计算器.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>;
计算器.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
}
【问题讨论】:
-
天哪,我在
return result之后添加了分号,现在它可以编译了。似乎这只是一个语法错误。