3

既存のライブラリ (「Webduino」、Arduino の Web サーバー) を別の既存のライブラリ (「WiFly」、wifi モジュール) で動作するように調整し、問題が発生しています。各ライブラリは単独で正常に動作します。Webduino ライブラリは、SPI 経由でイーサネット ハードウェア モジュールを使用することを想定していますが、WiFi モジュールはシリアル ポート (UART) を使用します。私が得るエラーは次のとおりです。

WiFlyClient.h: In member function 'WiFlyClient& WiFlyClient::operator=(const WiFlyClient&)':
WiFlyClient.h:14:
error: non-static reference member 'WiFlyDevice& WiFlyClient::_WiFly', can't use default assignment operator
WiFlyWebServer.h: In member function 'void WebServer::processConnection(char*, int*)':
WiFlyWebServer.h:492: note: synthesized method 'WiFlyClient& WiFlyClient::operator=(const WiFlyClient&)' first required here

関連するコード スニペットを次に示します。これまでのところ、WiFlyWebServer.h (Webduino) のみを変更していることに注意してください。

// WiFlyWebServer.h (Webduino)
...
WiFlyServer m_server; // formerly EthernetServer and
WiFlyClient m_client; // EthernetClient
...
void WebServer::processConnection(char *buff, int *bufflen){
  ...
  // line 492
  m_client = m_server.available();
  ...
}



// WiFlyClient.h
class WiFlyClient : public Client {
 public:
  WiFlyClient();
  ...
private:
  WiFlyDevice& _WiFly;
  ...
}



// WiFlyClient.cpp
#include "WiFly.h"
#include "WiFlyClient.h"

WiFlyClient::WiFlyClient() :
  _WiFly (WiFly) {    // sets _wiFly to WiFly, which is an extern for WiFlyDevice (WiFly.h)
  ...
}


// WiFly.h
#include "WiFlyDevice.h"
...
extern WiFlyDevice WiFly;
...



// WiFlyDevice.h
class WiFlyDevice {
  public:
    WiFlyDevice(SpiUartDevice& theUart);
...



// WiFlyDevice.cpp
WiFlyDevice::WiFlyDevice(SpiUartDevice& theUart) : SPIuart (theUart) {
  /*

    Note: Supplied UART should/need not have been initialised first.

   */
  ...
}

問題はm_client = m_server.available();、問題が解決したことをコメントした場合に発生します(ただし、すべてがその行に依存しています)。実際の問題は、WiFiClientオブジェクトが割り当てられているときに_WiFlyメンバーが初期化(上書き?)できないことのようですが、変更なしで動作するのに、なぜここで動作しないのか理解できません。

(はい、ヘッダーファイルに実装があることは知っています。なぜ彼らがそのように書いたのかわかりません。私を責めないでください!)

洞察はありますか?

4

3 に答える 3

5

あなたのWiFlyメンバーがWiFlyClientクラスを割り当て不可にしています。その理由は、代入を使用して、参照が参照しているオブジェクトを変更できないためです。例えば:

int a = 1;
int b = 2;
int &ar = a;
int &br = b;
ar = br; // changes a's value to 2, does not change ar to reference b

すべてWiFlyClientの が同じWiFlyDeviceインスタンスを参照しWiFlyClientているため、コンパイラが静的メンバーを使用するように提案するように変更できます。

// WiFlyClient.h
class WiFlyClient : public Client {
 public:
  WiFlyClient();
  ...
private:
  static WiFlyDevice& _WiFly;
  ...
};

次に、コンストラクターではなく、それを定義するソース ファイルで初期化します。

WiFlyDevice & WiFlyClient::_WiFly = WiFly;
于 2012-08-17T20:23:07.603 に答える
0

オーバーライドしてみてくださいoperator=

WiFlyClient& operator= (const WiFlyClient & wi)
{
  /* make a copy here */ 
  return *this;
}
于 2012-08-17T20:26:16.550 に答える
0

明らかに問題は、それWiFlyClientが割り当てられないことです。少なくともそのタイプの項目を割り当てることができるように、 std::unique_ptr(C++03 では) に含めることを検討してください。std::auto_ptr

std::unique_ptr<WiFlyClient> m_client;

...

m_client = m_server.available();

...

// convert m_client.<...> to m_client-><...>

// change m_server.available() to return std::unique_ptr<WiFlyClient>
于 2012-08-17T20:04:24.290 に答える