没有为显式模板实例化请求提供合适的定义
no suitable definition provided for explicit template instantiation request
我有一个Calculator<T>
类和一个LoggingCalculator<T>
类,它继承自Calculator<T>
。Calculator<T>
有一个虚拟方法,如add
、multiply
等。在子类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
的定义,因为定义不可用。
由于显式模板实例化是一个定义,因此它通常不应该出现在头文件中 - 这可能会导致多定义问题。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- HTTP POST 请求不允许我定义上下文类型
- 没有为显式模板实例化请求提供合适的定义
- 如何允许 POCO 句柄请求方法的 CORS 和自定义标头?
- 为C /CLI中的所有请求添加自定义的标头到WebBrowser控件
- 警告 C4661:没有为显式模板实例化请求提供合适的定义
- glibmm/gtkmm自定义属性解释/示例请求
- libcurl使用相同的用户定义端口发送定期请求
- 可以在程序退出时和请求输入时自动刷新自定义流缓冲区
- 自定义运算符new[]请求大于预期的内存
- C++ 请求成员,属于非类类型(使用类模板时,无法在主中定义)
- 请求从 'KanjiCard*' 转换为非标量类型'KanjiCard'(自定义枚举)