<< 演算子を使用してさまざまなデータ型を出力するために次のテンプレートを使用している arduino プロジェクトに取り組んでいます
template<class T>
inline Print &operator <<(Print &obj, T arg)
{ obj.print(arg); return obj; }
RAMの代わりにフラッシュにデータを保存するArduinos Pマクロで保存されたchar配列を処理しようとするまで、これは問題ありませんでした
//params stored in flash using P() from webduino library
P(CT_PLAIN) = "text/plain\n";
server << CT_PLAIN;
コンパイラエラーが発生する
httpServer.h : : In function 'Print& operator<<(Print&, T) [with T = const prog_uchar*]':
httpServer.cpp : instantiated from here
httpServer.h : call of overloaded 'print(const prog_uchar*&)' is ambiguous
以下はコンパイルされますが
//params stored in flash using P() from webduino library
P(CT_PLAIN) = "text/plain\n";
server.printP(CT_PLAIN);
<< 演算子のオーバーロードを作成しようとしましたが、構文と方法論を完全には理解していません。数時間調査して役に立ちませんでした。フィードバックをいただければ幸いです。
WebServer &operator <<(WebServer &server,const prog_uchar *str)
{ server.printP(str); }
template<class T>
inline Print &operator <<(Print &obj, T arg)
{ obj.print(arg); return obj; }
それでも同じコンパイラエラーが発生しますが。
WebServer::printP の宣言は
void printP(const prog_uchar *str);
フィードバックや支援をいただければ幸いです。
完全なコンパイラ エラー:
Compiling 'webapp' for 'Arduino Mega 2560 or Mega ADK'
httpServer.h : : In function 'Print& operator<<(Print&, T) [with T = const prog_uchar*]':
httpServer.cpp : instantiated from here
httpServer.h : call of overloaded 'print(const prog_uchar*&)' is ambiguous
Print.h : print(const String&) <near match>
Print.h : print(const char*) <near match>
Print.h : print(char) <near match>
Print.h : print(unsigned char, int) <near match>
Print.h : print(int, int) <near match>
Print.h : print(unsigned int, int) <near match>
Print.h : print(long int, int) <near match>
Print.h : print(long unsigned int, int) <near match>
Error compiling
さらに WebServer::printP の定義
void WebServer::printP(const prog_uchar *str)
{
// copy data out of program memory into local storage, write out in
// chunks of 32 bytes to avoid extra short TCP/IP packets
uint8_t buffer[32];
size_t bufferEnd = 0;
while (buffer[bufferEnd++] = pgm_read_byte(str++))
{
if (bufferEnd == 32)
{
m_client.write(buffer, 32);
bufferEnd = 0;
}
}
// write out everything left but trailing NUL
if (bufferEnd > 1)
m_client.write(buffer, bufferEnd - 1);
}