Arduino Library中没有匹配的调用函数

时间:2016-08-11 20:16:52

标签: c++ arduino

我正在创建一个用于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号。

2 个答案:

答案 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)
{

实际上,其他变量也是如此 - 没有理由在构造函数体内初始化它。