没有为显式模板实例化请求提供合适的定义

no suitable definition provided for explicit template instantiation request

本文关键字:定义 请求 实例化      更新时间:2023-10-16

我有一个Calculator<T>类和一个LoggingCalculator<T>类,它继承自Calculator<T>Calculator<T>有一个虚拟方法,如addmultiply等。在子类LoggingCalculator<T>中,我正在尝试覆盖这些方法。我已经覆盖了add方法,很好。但是我不能覆盖multiply,因为编译器说:

计算器::计算器

[int]::计算器(void(':没有为显式模板实例化请求提供合适的定义

即使,我显式实例化了我的模板。我真的不明白,为什么覆盖multiply方法会发生此错误,而add编译正常

真正奇怪的是,如果我不返回从基类方法返回的泛型值,它确实可以编译。但是,如果要从基类方法返回结果,则不会编译。请参阅下面的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>;

日志记录计算器.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
}

您必须将显式实例化移动到它们各自的源文件。这是因为您正在实例化的内容的定义需要在实例化时可访问。

你现在所做的是实例化类Calculator<int>的定义,并随之实例化Calculator<int>::add声明,但它没有实例化Calculator<int>::add的定义,因为定义不可用。

由于显式模板实例化是一个定义,因此它通常不应该出现在头文件中 - 这可能会导致多定义问题。