##初めに
C++でオブジェクト指向プログラミングをしてる時に初歩的な問題にぶち当たったので備忘録です。
##どうして引っかかったの?
ArduinoIDEでライブラリ開発をしているときにあたりました。
今まで、引数に変数ではなく、数値を入力してエラーを食らったことがなかったので気が付くまで時間がかかりました。
以下のコードをコンパイルするとエラーが出ます。
アンコメントするとコンパイルできます。
#define uchar unsigned char
#define ushort unsigned short
class L6470
{
public:
L6470(char port)
{
SSport = port;
}
void step_mode(uchar);
void spiSend(uchar);
void spiSend(ushort);
//void spiSend(int);
};
#include "L6470.hpp"
void L6470::init()
{
SPI.begin();
pinMode(PIN_SPI_MOSI, OUTPUT);
pinMode(PIN_SPI_MISO, INPUT);
pinMode(PIN_SPI_SCK, OUTPUT);
pinMode(SSport, OUTPUT);
//nop命令
spiSend(0x00);
spiSend(0x00);
spiSend(0x00);
spiSend(0x00);
//デバイスリセットコマンド
spiSend(0xc0);
}
//ステップ分解能
void L6470::step_mode(uchar value)
{
spiSend(0x16);
spiSend(value);
}
void L6470::spiSend(uchar value)
{
digitalWrite(SSport,LOW);
SPI.transfer(value);
digitalWrite(SSport,HIGH);
}
void L6470::spiSend(ushort value)
{
uchar ucWork1,ucWork2;
ucWork1 = value >> 8;
ucWork2 = value & 0x00FF;
digitalWrite(SSport,LOW);
SPI.transfer(ucWork1);
SPI.transfer(ucWork2);
digitalWrite(SSport,HIGH);
}
/*void L6470::spiSend(int value)
{
digitalWrite(SSport,LOW);
SPI.transfer(value);
digitalWrite(SSport,HIGH);
}*/
コンパイルすると
error:call of overloaded 'spiSend(int)' is ambiguous
というエラーが生じます。
引数の型が曖昧で、オーバーロードでintが無いよっていう感じのエラーですね。
このコードでは、spiSend(0xc0);引数に数値を入力したあたりがエラーになっています。
数値といえど、1バイトなのでcharでいけると思いましたが、だめみたいです。
void L6470::spiSend(ushort value)
void L6470::spiSend(uchar value)
ucharはunsigned char
ushortはunsigned shortと定義しています
上記の二つのオーバーロードされたメソッドは引数としてucharとushortにしています。
##どうしてエラーになるのか
引数を数値にした場合にエラーが出ます。
spiSend(0xc0);
上記の部分です。
オーバーロードで、他の型が定義されているときには、数値はint型として処理されます。
よって、オーバーロードの引数のintが無いよっていうエラーが出るみたいです。
解決するにはオーバーロードで
void L6470::spiSend(int value)
を定義する必要があります。
##まとめ
オーバーロードをしているときはの引数として数値を入力すると、int型として処理されます。
そもそもcharは一文字intは数値なのでよくよく考えたら当たり前のエラーですね。
気づくのが時間かかったの悲しいです。