以下代码在没有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中,我也想知道是否需要在构造函数中初始化它。
答案 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
作为构造函数参数传递给Serial1
。 handler
必须是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;