gpt4 book ai didi

c++ - 无法使派生的WebDuino类正常工作-使用 'Web_HelloWorld.ino'编译错误

转载 作者:行者123 更新时间:2023-12-02 11:04:53 26 4
gpt4 key购买 nike

我制作了一个名为WebServer_My2KNJ.h的派生类,称为WebServer_My2.h(参见这些文件的详细信息,请参见下面的“注意”部分),并且在尝试编译示例程序时遇到以下错误: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))'

The line webserver.setDefaultCommand(&helloCmd); in the file Web_HelloWorld.ino is highlighted at the time.

My Derived Class:

/*
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

注意:
  • 我是C++的新手,所以请多多包涵。
  • 除了“WebServer_My2KNJ.h”以外,所有使用的文件都与“https://github.com/sirleech/Webduino”中的文件基本相同。
  • 如果我使用“WebServer_My2.h”而不是“WebServer_My2KNJ.h”,则
  • 'Web_HelloWorld.ino'会编译并正常运行。
  • 在父类“WebServer_My2.h”中,我所做的只是通过将“private:”更改为“protected:”以及类名来修改“WebServer.h”。
  • 我要解决此问题的原因是,我想稍后向此类添加更多功能。因此,为了使内容更简洁明了,最好将代码放在派生类中。
  • 最佳答案

    简短答案:

    更改helloCmd()以采用WebServer_My2&而不是WebServer_My2KNJ&

    长答案:

    看来问题出在Command文件中的WebServer_My2.h函数指针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 ()块是必需的。

    关于c++ - 无法使派生的WebDuino类正常工作-使用 'Web_HelloWorld.ino'编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19450497/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com