没有调用 'WidgetBridge::WidgetBridge()' 的匹配函数

Posted

技术标签:

【中文标题】没有调用 \'WidgetBridge::WidgetBridge()\' 的匹配函数【英文标题】:no matching function for call to 'WidgetBridge::WidgetBridge()'没有调用 'WidgetBridge::WidgetBridge()' 的匹配函数 【发布时间】:2018-04-09 08:58:08 【问题描述】:

我已经访问过这个论坛很多很多次了,但这是我在这里的第一篇文章。通常我可以在这里找到我的答案,我想这次我可能已经找到了,但是这次我的知识缺乏理解给出的解决方案(过去 2 周一直在学习 C++)。

我得到的错误:

'WidgetBridge::WidgetBridge()'的调用没有匹配的函数

摘录我的(相当冗长的)代码:

class Room 
private:

  //initializer list of internal objects
  WidgetBridge bridge_thermostat;
  WidgetBridge bridge_relay;

public:
  //Constructor of the class:
  Room() : bridge_thermostat(V100), bridge_relay(V107)

  void initBridges(String authThermostat, String authRelay)
      bridge_thermostat.setAuthToken(authThermostat);
      bridge_relay.setAuthToken(authRelay);
  

  void receiveCurrentT(float param)
    currentT = param;
    Blynk.virtualWrite(V10, currentT);
    timer.restartTimer(thermostatTimer );          //reset isDead timer for thermostat
    Blynk.setProperty(V17, "color", BLYNK_GREEN);    //change LED color
    Blynk.virtualWrite(V17, 200);
  
 livingRoom;

BLYNK_CONNECTED() 
  Blynk.syncAll();
  livingRoom.initBridges("xxx", "xxxx");  //auth of: thermostat, relay

BLYNK_WRITE(V10) livingRoom.receiveCurrentT(param.asFloat());         //receive currentT from thermostat

根据我在这个论坛上找到的答案,WidgetBridge 在调用时似乎没有自己的构造函数。根据给出的答案,我也尝试过:

public:
    //Constructor of the class:
  Room() : 
    bridge_thermostat = V100;
    bridge_relay = V107;
  

但这会产生同样的错误。我继续阅读有关静态字段、构造函数、命名空间等的内容,但底线是:我被卡住了,我不知道如何解决这个问题。

附加信息:代码用于与其他 esp8266(继电器和恒温器)通信的 esp8266 arduino wifi 模块。通信通过使用来自Blynk app 的代码创建的“桥梁”进行。

感谢您的宝贵时间!

更新:我终于找到了真正的 calss widgetbridge 本身。从提到的解决方案中,我了解到它本身没有构造函数,但确实如此……所以现在我真的迷路了。这是小部件类的一部分:

class WidgetBridge
    : private BlynkWidgetBase

public:
    WidgetBridge(uint8_t vPin)
        : BlynkWidgetBase(vPin)
    

    void setAuthToken(const char* token) 
        char mem[BLYNK_MAX_SENDBYTES];
        BlynkParam cmd(mem, 0, sizeof(mem));
        cmd.add(mPin);
        cmd.add("i");
        cmd.add(token);
        Blynk.sendCmd(BLYNK_CMD_BRIDGE, 0, cmd.getBuffer(), cmd.getLength()-1);
    
(....)
;

【问题讨论】:

您的第一个构造函数不应该导致该错误,但第二个应该。错误消息还应指出它所引用的源中的位置。请分享它是什么。 不确定您到底在寻找什么,但这里是完整的错误报告:dropbox.com/s/fol1cplf16iq369/errorResult.txt?dl=0 Room() : targetT(20), currentT(20), heatOn(false), maintenanceOn(false) errorOn(false) 这不是您显示的代码。 【参考方案1】:

从您发布的代码摘录(部分)和错误消息(部分...)中,唯一合理的答案是 WidgetBridge 类没有默认构造函数(即具有 0 参数的构造函数)。

可能是因为基类 BlynkWidgetBase 也没有默认构造函数。

所以你会在这些行上得到编译器错误

  //initializer list of internal objects
  WidgetBridge bridge_thermostat;
  WidgetBridge bridge_relay;

您可以实现 WidgetBride 默认构造函数,也可以使用带有 uint8_t 参数的构造函数来实例化这两个变量:

  //initializer list of internal objects
  WidgetBridge bridge_thermostat(3); 
  WidgetBridge bridge_relay(4);

3 和 4 被替换为任何有意义的值,但只有你可以从代码提取中知道

【讨论】:

以上是关于没有调用 'WidgetBridge::WidgetBridge()' 的匹配函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有调用 didDeselectRowAtIndexPath

即使调用了 didDetermineState,也没有调用 didrangebeacons

角后端服务调用没有休息调用

如何实现:如果函数还没有被调用,做点啥?

调用加入时如何修复“终止调用而没有活动异常”

无法调用其类型缺少调用签名的表达式...没有兼容的调用签名