如何将模板定义转换为类

时间:2017-07-23 15:03:12

标签: c++ class templates arduino

以下代码在没有C ++类(Arduino代码)时使用;

MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, midiA);

这将创建一个具有正确类型的变量midiA。宏定义是:

#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name)                            \
    midi::MidiInterface<Type> Name((Type&)SerialPort);

但是,我想在一个类中使用它(创建一个类变量midiA),但是我无法让它工作。

我现在拥有的是:

class MidiHandler
{
    midi::MidiInterface<(HardwareSerial&) Serial1)> midiA;
}

但是,我收到以下错误:

MidiHandler.h: 23:39: error: type\value mismatch at argument 1 in template parameter list for 'template<class SerialPort, class _Settings> class midi::MidiInterface
  midi*: MidiInterface<((HardwareSerial&)Serial1)> midiA

我想我可能需要将模板添加到类MidiHandler中,我也想知道是否需要在构造函数中初始化它。

3 个答案:

答案 0 :(得分:1)

如定义所示:

#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name) midi::MidiInterface<Type> Name((Type&)SerialPort);

所以替换你的值应该是:

midi::MidiInterface<HardwareSerial> midiA((HardwareSerial&)Serial1);

答案 1 :(得分:1)

免责声明:我没有Arduino来编译和测试它,但从纯C ++的角度来看,我会在类声明中声明成员并在构造函数中初始化它。像这样:

class MidiHandler
{
public:
    MidiHandler(HardwareSerial& serial_port)
        : midiA(serial_port)
    { }

private:
    midi::MidiInterface<HardwareSerial> midiA;
};

然后,实例化这样的类:

MidiHandler handler((HardwareSerial&) Serial1);

DETAIL:

MidiHandler类有一个名为midiA的{​​{1}}类型的成员变量,它是一个模板,带有一个模板参数(来自宏的midi::MidiInterface<HardwareSerial>参数)。 Type用作模板参数的值。

类型HardwareSerial有一个构造函数,需要一个midi::MidiInterface<HardwareSerial>类型的参数。因此,HardwareSerial&类构造函数MidiHandler::MidiHandler需要使用相同类型的参数来构造MidiHandler

最后,midiA作为构造函数参数传递给Serial1handler必须是Serial1类型或可转换为它。根据Serial1的类型,可能需要也可能不需要C阶段强制转换HardwareSerial&,但是我将它放在那里,因为宏有它。

答案 2 :(得分:0)

回答路易斯古兹曼接受的答案:

在头文件中:

=IF(COUNTIF($C$3:C3,C3)=1,CONCATENATE(C3,"",TEXT(SUMIF($C$3:C102,C3,F$3:F$101),"$0.0"),0),"")

在构造函数中:

midi::MidiInterface<HardwareSerial> midiA;
midi::MidiInterface<HardwareSerial> midiB;
midi::MidiInterface<HardwareSerial> midiC;