我正在创建一个用于Sketch的Arduino库。它使用Encoder Library,但在编译时我得到一个钝误:
/var/folders/jy/f8dvlhcd4vdcvtl49bk8ytwc0000gn/T/builda847c0675e0bee2f5f05581e35ae65fe.tmp/sketch/MIDIEncoder.cpp:在构造函数'MIDIEncoder :: MIDIEncoder(uint8_t,uint8_t,byte,byte)'中: MIDIEncoder.cpp:8:错误:没有用于调用'Encoder :: Encoder()'的匹配函数 MIDIEncoder :: MIDIEncoder(uint8_t pinA,uint8_t pinB,byte midiChannel,byte midiCCNumber) ^ /var/folders/jy/f8dvlhcd4vdcvtl49bk8ytwc0000gn/T/builda847c0675e0bee2f5f05581e35ae65fe.tmp/sketch/MIDIEncoder.cpp:8:89:注意:候选人是: 在/var/folders/jy/f8dvlhcd4vdcvtl49bk8ytwc0000gn/T/builda847c0675e0bee2f5f05581e35ae65fe.tmp/sketch/MIDIEncoder.h:17:0中包含的文件中, 来自/var/folders/jy/f8dvlhcd4vdcvtl49bk8ytwc0000gn/T/builda847c0675e0bee2f5f05581e35ae65fe.tmp/sketch/MIDIEncoder.cpp:2: /Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Encoder/Encoder.h:72:2:注意:Encoder :: Encoder(uint8_t,uint8_t) 编码器(uint8_t pin1,uint8_t pin2){ ^ /Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Encoder/Encoder.h:72:2:注意:候选人需要2个参数,0提供 /Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Encoder/Encoder.h:69:7:注意:constexpr Encoder :: Encoder(const Encoder&) 类编码器 ^ /Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Encoder/Encoder.h:69:7:注意:候选人需要1个参数,0提供 /Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Encoder/Encoder.h:69:7:注意:constexpr Encoder :: Encoder(Encoder&&) /Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Encoder/Encoder.h:69:7:注意:候选人需要1个参数,0提供 没有用于调用'Encoder :: Encoder()'
的匹配函数
从根本上说,我相信编译器告诉我它找不到编码器库MIDIEncoder.cpp:8: error: no matching function for call to 'Encoder::Encoder()'
的构造函数,但我很难理解为什么。以下是我的图书馆的完整资源。
MIDIEncoder.h
/*
MIDIEncoder.h
A library for creating relative MIDI CC messages from a rotary encoder.
Created by Paul Williamson, 11 August 2016.
Project source available at:
http://github.com/squarefrog/teensy-midi-encoder-box
Released into the public domain.
*/
#ifndef MIDIEncoder_h
#define MIDIEncoder_h
#include "Arduino.h"
#include <Encoder.h>
class MIDIEncoder
{
public:
MIDIEncoder(uint8_t pin1, uint8_t pin2, byte midiChannel, byte midiCCNumber);
byte channel;
byte ccNumber;
byte read();
private:
unsigned long _lastTurnedTime;
long _oldPosition;
Encoder _enc;
};
#endif
MIDIEncoder.cpp
#include "MIDIEncoder.h"
#include <Encoder.h>
const byte incrementValue = 66; // A constant for the start of increment values
const byte decrementValue = 2; // A constant for the start of decrement values
MIDIEncoder::MIDIEncoder(uint8_t pin1, uint8_t pin2, byte midiChannel, byte midiCCNumber)
{
channel = midiChannel;
ccNumber = midiCCNumber;
_enc = Encoder(pin1, pin2);
_oldPosition = -999;
_lastTurnedTime = millis();
}
byte MIDIEncoder::read()
{
long newPosition = _enc.read();
// If position hasn't changed, ignore.
if (newPosition == _oldPosition) {
return 0;
}
// If position is not divisible by 4, ignore.
if (newPosition % 4 != 0) {
return 0;
}
unsigned long delta = millis() - _lastTurnedTime;
byte offset = 0;
// Apply crude acceleration
if (delta < 100) offset = 4;
if (delta > 99 && delta < 180) offset = 2;
if (delta > 179 && delta <= 250) offset = 1;
_lastTurnedTime = millis();
// Return MIDI CC value
if (newPosition > _oldPosition) {
return incrementValue + offset;
} else {
return decrementValue + offset;
}
}
以下一些优秀的答案。现在我知道要找什么了,我发现this resource解释了我犯错误的地方。特别要看3号。
答案 0 :(得分:2)
Encoder
没有默认构造函数,它隐式调用
MIDIEncoder::MIDIEncoder(uint8_t pin1, uint8_t pin2, byte midiChannel, byte midiCCNumber)
/*Implicit constructor call*/
{
//...
}
你试图将它称为构造函数体,但到那时“已经太晚了”:)我的意思是,_enc
必须在构造函数体执行时已经初始化,但是{{1} }无法默认初始化,因此编译器会抱怨。
这就是构造函数初始化列表的用途:
_enc
答案 1 :(得分:1)
您太迟了初始化_enc
对象。
在MIDIEncoder构造函数的开头,应该已经创建了body _enc
,因此编译器尝试使用(缺少的)默认构造函数实例化它并失败。
在构造函数初始化列表中初始化它:
MIDIEncoder::MIDIEncoder(uint8_t pin1, uint8_t pin2, ...) : _enc(pin1, pin2)
{
实际上,其他变量也是如此 - 没有理由在构造函数体内初始化它。