Templates 实现一些通用方法的模板化抽象类
我使用avr gcc,在我的项目中有三个能够输出字符的设备(蓝牙、LCD、串行端口)。所以我写了三个类来实现这个方法Templates 实现一些通用方法的模板化抽象类,templates,abstract-class,avr-gcc,Templates,Abstract Class,Avr Gcc,我使用avr gcc,在我的项目中有三个能够输出字符的设备(蓝牙、LCD、串行端口)。所以我写了三个类来实现这个方法 ClassName*写入(常量字符c)。现在我的想法是编写一个抽象类,它具有虚拟方法ReturnType*write(const char c),并实现一些其他方法,如ReturnType*write(const char*c)或ReturnType*writeInt(const int16_ti)等 因此,我得出以下结论: template <class ReturnTy
ClassName*写入(常量字符c)
。现在我的想法是编写一个抽象类,它具有虚拟方法ReturnType*write(const char c)
,并实现一些其他方法,如ReturnType*write(const char*c)
或ReturnType*writeInt(const int16_ti)
等
因此,我得出以下结论:
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;
}
};
模板
类输出设备{
公众:
虚拟设备();
虚拟返回类型*写入(常量字符c)=0;
返回类型*写入(常量字符*c){
而(*c){
写(*c++);
}
归还这个;
}
};
但是当我尝试在三个普通类中的一个中使用这个抽象类时,我遇到了一个奇怪的错误:
#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;
}
};
#包括“OutDevice.h”
类显示:公共输出设备{
私人:
无效发送(uint8\u t控制,uint8\u t数据){
//一些东西
}
公众:
Display*write(const char c){//错误:初始化'virtual Display*Display::write(char)'[-fppermissive]的参数1
发送(_BV(IOC2),c);
归还这个;
}
显示*写入(常量行、常量列、常量字符*文本){
setCursorPos(行、列);
写入(文本);//错误:从“const char*”到“char”[-fppermissive]的转换无效
归还这个;
}
};
在第10行,我发现了这个错误:
错误:初始化'virtual Display*Display::write(char)[-fppermissive]的参数1
做我想做的事情的最佳方式是什么?我做错了什么
谢谢大家!
编辑:
添加了一个额外的方法,avr gcc给了我一个错误。您将参数声明为
const char
:
Display* write(const char c)
这可能是一个错误,因为基类方法采用的是const char*
:
ReturnType* write(const char * c)
当您尝试使用const char*
参数调用该方法时,这种不匹配会导致错误
即使这不是一个错误,效果也是一样的。
write()
函数的声明对基类隐藏了任何重载的声明。因此,重写函数是编译器试图调用的函数,其他基类方法不被考虑
要使基类中的其他重载函数“进入作用域”,请使用声明向派生类添加一个:
using OutDevice::write;
这样,应该调用正确的重载。否。这是正确的。在基类中还有虚拟方法ReturnType*write(const char c)
。在Display类中,我覆盖了这个虚拟方法。现在我希望能够在Display类的基类中使用实现的方法。@user2280245:我已经在我的答案中添加了一些关于新信息的内容。谢谢<代码>使用
是我需要的关键词。