模板化的抽象类,它实现了一些通用的方法

时间:2014-06-10 23:09:09

标签: templates abstract-class avr-gcc

我使用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给了我。

1 个答案:

答案 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;

这样就应该调用正确的重载。