繁体   English   中英

带有模板未定义引用错误的 C++ 继承

[英]C++ Inheritance with templates undefined reference error

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

基类

    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'的未定义引用

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

您尚未为Trigger<T>定义operator()的实现。 一种选择是通过使运算符成员函数成为纯虚函数来使Trigger成为抽象基类:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM