2013-10-18 26 views
0

我做了一個名爲WebServer_My2.h的工作類WebServer_My2KNJ.h的派生類(關於這些文件的細節,請參閱下面的註釋部分),並且我得到了以下內容錯誤時,我試圖編譯示例程序:Web_HelloWorld.ino無法獲得派生的WebDuino類 - 編譯錯誤'Web_HelloWorld.ino'

編譯錯誤消息:(或看到附加文件「ErrorMsg.txt」):

 
Web_HelloWorld.ino: In function 'void setup()': 
Web_HelloWorld:57: error: invalid conversion from 'void (*)(WebServer_My2KNJ&, WebServer_My2::ConnectionType, char*, bool)' to 'void (*)(WebServer_My2&, WebServer_My2::ConnectionType, char*, bool)' 
Web_HelloWorld:57: error: initializing argument 1 of 'void WebServer_My2::setDefaultCommand(void (*)(WebServer_My2&, WebServer_My2::ConnectionType, char*, bool))' 
Web_HelloWorld:61: error: invalid conversion from 'void (*)(WebServer_My2KNJ&, WebServer_My2::ConnectionType, char*, bool)' to 'void (*)(WebServer_My2&, WebServer_My2::ConnectionType, char*, bool)' 
Web_HelloWorld:61: error: initializing argument 2 of 'void WebServer_My2::addCommand(const char*, void (*)(WebServer_My2&, WebServer_My2::ConnectionType, char*, bool))' 

文件Web_HelloWorld.ino中的線webserver.setDefaultCommand(&helloCmd);在被加亮時間。

我的派生類:

/* 
    WebServer_My2KNJ.cpp - Extension of the library class 'WebServer_My2' 
    Created by: COG008 
    Date Created: 2013/10/17 
*/ 

#ifndef WebServer_My2KNJ_h 
#define WebServer_My2KNJ_h 

#include <..\Webduino_My2\WebServer_My2.h> 

class WebServer_My2KNJ: public WebServer_My2 
{ 
public: 

// constructor for webserver object 
WebServer_My2KNJ(const char *p_urlPrefix = "", int p_port = 80); 
}; 
WebServer_My2KNJ::WebServer_My2KNJ(const char *p_urlPrefix, int p_port) : 
WebServer_My2::WebServer_My2(p_urlPrefix, p_port) 
{ 
; 
} 

#endif 

注:

  1. 我是一個新手,C++,所以大家多多包涵。
  2. 除'WebServer_My2KNJ.h'外的所有文件基本上都是'https://github.com/sirleech/Webduino'。
  3. 'Web_HelloWorld.ino'編譯並運行正常,如果我使用'WebServer_My2.h'而不是'WebServer_My2KNJ.h'。
  4. 在父類「WebServer_My2.h」中,我所做的只是通過將'private:'更改爲'protected:'和類名來修改'WebServer.h'。
  5. 我之所以會遇到這個麻煩,是因爲我想稍後爲這個類添加更多的功能。因此,爲了讓事情變得更清潔和簡單,我最好將我的代碼放在派生類中。
+0

你是否改變了'helloCmd()'參數? –

+0

不,我沒有對'helloCmd()'函數做任何修改。正如我前面所說,如果我#include'WebServer_My2.h'而不是'WebServer_My2KNJ.h',Arduino應用程序'Web_HelloWorld.ino'編譯並正常工作。這個應用程序的非修改版本'Web_HelloWorld.ino'可以通過上面給出的鏈接('https://github.com/sirleech/Webduino')查看。 – user2894689

+0

問題是傳遞給'setDefaultCommand()'的'helloCmd'與期望的不太匹配。如果你沒有修改它,那麼肯定還有其他的東西會影響它的參數,例如typedef某處。 WebServer_My2.h來自哪裏?它和WebServer.h完全一樣嗎? –

回答

0

簡短的回答:

變化helloCmd()採取WebServer_My2&,而不是一個WebServer_My2KNJ&

龍答:

它看起來像問題,從您的WebServer_My2.h文件Command函數指針的typedef莖。它可能聲明如下(行〜169頁):

typedef void Command(WebServer_My2 &server, ConnectionType type, 
        char *url_tail, bool tail_complete); 

這意味着它是一個指針,它接受一個WebServer_My2對象作爲其第一個參數的基準的函數(其次是一些其他)。有一些方法,如setDefaultCommand(),它接受這種確切類型的函數指針。 C++在這裏是嚴格的。您不能替換接受派生類型的引用參數的另一個函數指針。

我知道你說你沒有修改helloCmd,但是基於錯誤信息,我必須假設你實際上改變了參數列表如下:

void helloCmd(WebServer_My2KNJ &server, WebServer_My2::ConnectionType type, char *, bool) 

因此問題是當代碼試圖做這些行:

webserver.setDefaultCommand(&helloCmd); 
webserver.addCommand("index.html", &helloCmd); 

setDefaultCommand()addCommand()方法期待一個函數指針,這需要WebServer_My2參考作爲第一個參數。但是,helloCmd()實際上需要WebServer_My2KNJ參考。這是行不通的,因爲類型是不同的(儘管一個是從另一個派生的)。

一個快速解決方案是按照我在上面的簡短回答中所建議的那樣更改helloCmd()。這樣它至少應該能夠編譯和運行這個例子。如果你想使用您添加到您的子類擴展功能,那麼您可以在功能做到這一點:

WebServer_My2KNJ * myServer = dynamic_cast<WebServer_My2KNJ*>(&server); 
if (myServer) { 
    // myServer is safe to use here 
} 

然後,您可以使用myServer指針來訪問所有附加的Web服務器的功能。請記住它是一個指針,所以您需要使用->運算符而不是.運算符來訪問成員。

如果可能,dynamic_cast會將繼承層次結構向下轉換。如果轉換不起作用,它將返回空指針(0),這就是爲什麼if()塊是必需的。

+0

嗨,彼得:你的努力; Top Notch等。我遵循你的簡短回答建議;創建了一個WebServer_My2.cpp以與縮短的「WebServer_My2.h」一起使用,並且一旦將類「WebServer_My2.h」包含在「Web_HelloWorld.ino」應用程序中,它就可以工作。例如,如果忽略額外包含,編譯器會給出'WebServer_My2 :: processConnection(char *,int *)'等未定義引用的錯誤。 – user2894689