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

标签 c++ templates

我有一个Calculator<T>类和a LoggingCalculator<T>类,继承自 Calculator<T>Calculator<T>有一个虚拟方法,如 add , multiply等在 child 类LoggingCalculator<T>我正在尝试重写这些方法。我已经覆盖了 add方法,不错。但我无法覆盖 multiply ,因为编译器说:

Calculator::Calculator[int]::Calculator(void)': no suitable definition provided for explicit template instantiation request

尽管如此,我明确地实例化了我的模板。我真的不明白,为什么覆盖 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定义 ,因为定义不可用。

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

关于c++ - 没有为显式模板实例化请求提供合适的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50543145/

相关文章:

c++ - 如何在 C++ 中比较两个类型名是否相等?

c++ - 嵌套类中的别名模板

c++ - 字符串文字的值类别是什么?

c++ - const_cast 的行为

c++ - 当对象创建为基类时,如何获取派生类型的shared_ptr?

c++ - 区分 map 和集合的模板

c++ - 减少彼此紧密关联的模板参数

C++11 搜索对象 vector

c++ - block 范围静态的析构函数可以被调用几次?

c++ - 这种基于线程 ID 的同步是否安全整洁?