Templates 实现一些通用方法的模板化抽象类

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

我使用avr gcc,在我的项目中有三个能够输出字符的设备(蓝牙、LCD、串行端口)。所以我写了三个类来实现这个方法
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:我已经在我的答案中添加了一些关于新信息的内容。谢谢<代码>使用
是我需要的关键词。