【问题标题】:Inheritance from a Template Class [closed]从模板类继承[关闭]
【发布时间】:2014-03-13 22:46:27
【问题描述】:

我有一个模板类,在 fsm.h 文件中 和 derivata.h 文件中的派生类; 编译器抛出错误:

derivata.h: In constructor ‘deri::deri()’:
derivata.h:46: error: no matching function for call to ‘fsm<pin_steps>::fsm()’
fsm.h:30: note: candidates are: fsm<step_type>::fsm(step_type) [with step_type = pin_steps]
fsm.h:12: note:                 fsm<pin_steps>::fsm(const fsm<pin_steps>&)

fsm.h:

#ifndef FSM_H_
#define FSM_H_


template<class step_type> class fsm {
    protected:
        step_type   step;
        step_type   step_old;
        step_type   step_tmp;
        bool        step_pulse;
        char        name[256];
    public:
        fsm(step_type);
        void set_name(char *parent, char *myname);
        void test();
        virtual void update(){cout << "base\n";};
        void show(){cout << step << ' ' << step_tmp << '\n'; };
        void init(step_type st_current) {step = st_current;};
        //virtual ~fsm();
};

//constructor
template <class step_type> fsm<step_type>::fsm(step_type) {
    step = step_old = step_tmp = (step_type)0 ;
    step_pulse = false;
}

template <class step_type> void fsm<step_type>::set_name(char *parent, char *myname) {
    sprintf(name, "%s.%s", parent, myname);
}

template <class step_type> void fsm<step_type>::test() {
    if (step != step_old) {
        step_pulse = true;
        step_tmp = step_old;
    } else step_pulse = false;
    step_old = step;
}

#endif /* FSM_H_ */

以及模板类的派生类:

#include "fsm.h"
#ifndef DERIVATA_H_
#define DERIVATA_H_

enum taglio_steps {
    ST_TAGLIO_CHECK_MOTORE,
    ST_TAGLIO_ZERO_MOTORE,
    ST_TAGLIO_WAIT_ZERO_MOTORE
};

enum pin_steps {
    ST_PIN_BOOT,
    ST_PIN_RETURN
};

class deri : public fsm<pin_steps>{
    private:
        bool    cmd_prelevamento_done;
        bool    cmd_scorrimento_done;
        float   posizione_pinza_i;
        float   posizione_pinza_f;
    public:
        deri(){
            cmd_prelevamento_done = false;
            cmd_scorrimento_done = false;
            posizione_pinza_i = 0;
            posizione_pinza_f = 0;
        };
        void update(){cout << "deri\n";};
//      virtual ~deri();
};

#endif /* DERIVATA_H_ */

【问题讨论】:

  • 欢迎您!你能把这个减少到testcase吗?

标签: c++ class inheritance


【解决方案1】:

该代码太大,但我认为您需要在基类中使用默认构造函数。好像是这样的

   public: 
    fsm(); //added
    fsm(step_type);
    void set_name(char *parent, char *myname);
    void test();
    virtual void update(){cout << "base\n";};
    void show(){cout << step << ' ' << step_tmp << '\n'; };
    void init(step_type st_current) {step = st_current;};
    //virtual ~fsm();

【讨论】:

    【解决方案2】:

    编译器错误似乎很明显。您没有调用fsm&lt;&gt; 构造函数,并且fsm 没有默认构造函数。因此,您的选择是:

    • 创建默认构造函数:fsm::fsm() { ... }
    • 或者,在您的情况下更有可能:调用 deri 初始化列表中的构造函数,如下所示:

      deri() : fsm(step_type_here)
      {
          cmd_prelevamento_done = false;
          cmd_scorrimento_done = false;
          posizione_pinza_i = 0;
          posizione_pinza_f = 0;
      };    
      

    我还建议将其他成员变量初始化也放入初始化列表中。

    【讨论】:

    • steptype 不会在那里工作。
    • 显然是占位符;我不知道 OP 想要什么
    【解决方案3】:

    您的基类没有非参数构造函数,但在派生类中您正在调用一个(它会自动调用)。

    改变这个:

        deri(){
            cmd_prelevamento_done = false;
            cmd_scorrimento_done = false;
            posizione_pinza_i = 0;
            posizione_pinza_f = 0;
        };
    

    对此(伪代码,我不确定语法是否正确,我不经常使用它):

        deri(): fsm<pin_steps>(ST_PIN_BOOT) {
            cmd_prelevamento_done = false;
            cmd_scorrimento_done = false;
            posizione_pinza_i = 0;
            posizione_pinza_f = 0;
        };
    

    【讨论】:

      【解决方案4】:

      如果(在派生类的构造函数中)您没有指定应该调用哪一个,则基类没有默认构造函数。如果您不希望 fsm 可以默认构造,请改为:

      deri() : fsm(ST_PIN_BOOT) // call fsm::fsm(pin_steps)
      {
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 2018-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多