3

<< 演算子を使用してさまざまなデータ型を出力するために次のテンプレートを使用している 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);
 }
4

2 に答える 2

5

事はあなたの最初の例にあります.あなたは自明に変換可能なprintP(const prog_uchar*)型の引数で呼び出しています.const prog_uchar[12]const prog_uchar*

を使用する場合、タイプのオブジェクトでoperator<<関数を呼び出していますが、このタイプに適したオーバーロードがありません。そのため、コンパイラはさまざまなオーバーロードを探し、最も適したものを採用します。ただし、「最適な」オーバーロードは 1 つだけではなく、8 つあるため、最後に詳細なエラー メッセージが表示されます。print()const prog_uchar[12]printprint

問題の解決策は、印刷しようとしているものを明示的にキャストすることですconst char*

P(CT_PLAIN) = "text/plain\n";
server << (const char*) CT_PLAIN;

別の解決策はprint、 のオーバーロードを提供することですconst prog_uchar*

于 2013-06-14T13:34:30.520 に答える