【问题标题】:Qt Optional Argument has no matching function call [duplicate]Qt可选参数没有匹配的函数调用[重复]
【发布时间】:2019-08-20 10:58:06
【问题描述】:

尝试使用定义为具有和选项参数的方法时出现编译错误。错误信息是这样的:

错误:没有匹配的函数调用 'ConsoleWidget::logInfo(const char [32])'consoleWidget->logInfo("这是记录信息消息");

以下是我的文件。

(标题).h

#ifndef CONSOLEWIDGET_H
#define CONSOLEWIDGET_H

#include <QTextEdit>
#include <QAction>
#include <QColor>

class ConsoleWidget : public QTextEdit
{
    Q_OBJECT
public:
    explicit ConsoleWidget(QWidget *parent = nullptr);

public slots:
    void logInfo(const QString& text, const bool includeTimestamp /*=false*/);
};

#endif // CONSOLEWIDGET_H

cpp (.cpp)

void ConsoleWidget::logInfo(const QString &text, bool includeTimestamp = false)
{
    ...
}

(主).cpp

auto *consoleWidget = new ConsoleWidget(this);
consoleWidget->logInfo("This is logging a message!");

【问题讨论】:

  • 这是因为main.cpp 不知道.cpp 文件中定义的默认参数值。尝试在标题中定义默认参数
  • 默认参数值必须在头文件中声明。

标签: c++ qt


【解决方案1】:

默认参数由函数的调用者(秘密地)评估和传递,因此必须知道函数的调用位置。

如果编译器已经看到了

 void foo(int x = 37);

然后遇到

foo();

它将替换为等效的

foo(37);

如果它只看到void foo(int x);,则不会有一个函数具有匹配的原型,因为函数总是需要一个int参数。

(这与 Python 不同,Python 在定义函数时计算默认参数,而调用代码不需要关心。)

解决方案是将默认值从函数定义移到其声明中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2013-07-23
    • 2019-12-15
    相关资源
    最近更新 更多