我在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_ */
答案 0 :(得分:0)
如果(在派生类的构造函数中)没有指定应该调用哪一个,那么基类没有默认的构造函数。如果您不希望fsm
成为默认构造,请改为:
deri() : fsm(ST_PIN_BOOT) // call fsm::fsm(pin_steps)
{
// ...
}
答案 1 :(得分:0)
您的基类没有非参数构造函数,但是在您的派生类中,您调用了一个(自动调用它)。
改变这个:
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;
};
答案 2 :(得分:0)
编译器错误似乎很清楚。您没有调用fsm<>
构造函数,并且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;
};
我还建议将其他成员变量初始化也放在初始化列表中。
答案 3 :(得分:0)
该代码太大但我认为你需要基类中的默认构造函数。看起来像这样的东西
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();