我使用avr-gcc,在我的项目中有三个能够输出字符的设备(蓝牙,LCD,串口)。所以我编写了三个实现该方法的类
ClassName* write(const char c)
。现在我的想法是编写一个抽象类,它具有虚拟方法ReturnType* write(const char c)
并实现其他方法,如ReturnType* write(const char* c)
或ReturnType* writeInt(const int16_t i)
等。
所以我来到这里:
template <class ReturnType>
class OutDevice {
public:
virtual ~OutDevice();
virtual ReturnType* write(const char c) = 0;
ReturnType* write(const char * c) {
while (*c) {
write(*c++);
}
return this;
}
};
但是当我尝试在我的三个普通类之一中使用这个抽象类时,我得到了一个奇怪的错误:
#include "OutDevice.h"
class Display : public OutDevice<Display> {
private:
void send(uint8_t control, uint8_t data) {
//some stuff
}
public:
Display* write(const char c) { //error: initializing argument 1 of 'virtual Display* Display::write(char)' [-fpermissive]
send(_BV(IOC2), c);
return this;
}
Display* write(const uint8_t row, const uint8_t column, const char* text) {
setCursorPos(row, column);
write(text); //error: invalid conversion from 'const char*' to 'char' [-fpermissive]
return this;
}
};
在第10行,我收到了这个错误:
错误:初始化'virtual Display * Display :: write(char)'[-fpermissive]
的参数1
做我想做的或做错的最好方法是什么?
谢谢!
修改 添加了一个额外的方法,错误avr-gcc给了我。
答案 0 :(得分:1)
您将参数声明为const char
:
Display* write(const char c)
这可能是一个错误,因为基类方法改为使用const char*
:
ReturnType* write(const char * c)
当您尝试使用const char*
参数调用方法时,此不匹配会导致错误。
即使它不是错误,效果也是一样的。 write()
函数的声明隐藏了基类的任何重载声明。因此,覆盖的函数是编译器尝试调用的函数,不考虑其他基类方法。
要将其他重载函数从基类&#34;带入范围&#34;,请在派生类中添加using
声明:
using OutDevice::write;
这样就应该调用正确的重载。