【问题标题】:C++ Inheritance with templates undefined reference error带有模板未定义引用错误的 C++ 继承
【发布时间】:2021-12-21 02:35:27
【问题描述】:

我想实现一个有多个孩子的基类。

基类

    template <typename T>
    class Trigger
    {
    protected:
        T threshold;
        Trigger(T a_threshold) : threshold(std::pow(10, a_threshold / 20)){};
    public:
        void setThreshold(T a_threshold)
        {
            threshold = std::pow(10, a_threshold / 20);
        }
        virtual bool operator()(const T &first, const T &second) const;
        virtual ~Trigger() = default;
    };

派生类

    template <typename T>
    class ZeroCrossingRisingTrigger : public Trigger<T>
    {
    public:
        ZeroCrossingRisingTrigger(void) : Trigger<T>(0.){};

        bool operator()(const T &first, const T &second) const override
        {
            return (first <= 0) & (second > 0);
        }
    };

在主文件中的使用

#include "Trigger.hpp"
int main([[maybe_unused]] int argc, [[maybe_unused]] char const *argv[])
{
    Trigger::ZeroCrossingRisingTrigger<double> trig;
    return 0;
}

但是当我尝试编译时出现以下错误:

(...): 对 `Trigger::Trigger::operator()(double const&, double const&) const' 的未定义引用

我不明白为什么会出现此错误,因为我完全按照错误消息中的说明实现了运算符。

【问题讨论】:

  • 它没有定义你只是宣布了它
  • 虚拟和模板不能很好地混合在一起stackoverflow.com/questions/2354210/…
  • 感谢您的 cmets。你会推荐使用 CRTP 来实现它吗?
  • 要么在基类中提供一个实现,要么使其成为纯粹的 (virtual bool operator()(const T &amp;first, const T &amp;second) const = 0;)

标签: c++ templates inheritance


【解决方案1】:

您尚未为Trigger&lt;T&gt; 定义operator() 的实现。一种选择是通过使操作员成员函数成为纯虚函数来使 Trigger 成为抽象基类:

virtual bool operator()(const T &first, const T &second) const = 0;

或者,您可以提供一个空实现。

顺便说一句,在ZeroCrossingRisingTrigger 的构造函数中,您将0.0 作为基类构造函数的参数传递。这种提示不需要 ZeroCrossingRisingTrigger 本身模板化,除非您想从外部控制 0.0 文字的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多