【问题标题】:No matching function to call - compiler says I call (QObject *&) when call is (QObject *)没有要调用的匹配函数 - 编译器说当调用是 (QObject *) 时我调用 (QObject *&)
【发布时间】:2014-04-21 12:35:47
【问题描述】:

这是代码:

void invokeQMLFunction2Arg(QObject * object, QString func, QVariant p1, QVariant p2) {
    QMetaObject::invokeMethod(object, func, Qt::DirectConnection, Q_ARG(QVariant, p1), Q_ARG(QVariant, p2));
}

这是错误:

error: no matching function for call to 'QMetaObject::invokeMethod(QObject*&, QString&, Qt::ConnectionType, QArgument<QVariant>, QArgument<QVariant>)'

我错过了什么?我用指针调用invokeMethod(),但编译器抱怨它是指针引用。

【问题讨论】:

  • “我用指针调用invokeMethod()” 你指的“指针”不存在。您正在传递对指针的引用,甚至可能是 const 引用或 rvalue 引用,但仍然如此。编译器是正确的。按值传递参数的工作原理是传递一个 const 引用(或右值引用),然后用于初始化对象的函数本地副本。

标签: c++ qt qtcore qt-signals qmetaobject


【解决方案1】:

您正在尝试将 QString 传递给第二个参数,而那应该是 const char*。将其转换为正确的类型,因为没有隐式转换。您需要首先决定将其转换为QByteArray 的方式,因此这是您可能编写的一个示例:

QMetaObject::invokeMethod(object, func.toUtf8().constData(), Qt::DirectConnection, Q_ARG(QVariant, p1), Q_ARG(QVariant, p2));

【讨论】:

  • 我指的是您最初的回答。无论如何,我仍然不明白为什么传递一个字符串会使 GCC 报告我用指针引用调用...我错误地假设 QString 自动转换为 char *,但为什么 QObject *&amp;
  • 不知道细节... gcc 疯了 :)
  • @user2341104 因为object 是一个左值。编译器没有说你传递了一个QObject*&amp;,它说你试图调用一个可以接受一个QObject*&amp;的函数。
  • @Oktalist:是的,但恕我直言,这不是理想的世界。
  • @LaszloPapp 你更喜欢什么? (无论如何,我不认为 OP 发布了整个错误。)
【解决方案2】:

我也遇到过同样的问题。我的问题实际上是由其他因素引起的。我将我的一个程序从 QT 4 移动到 QT 5,并且我没有显式声明 QDialog,所以当我调用该方法时,会出现错误:

error: no matching function for call to 'QMetaObject::invokeMethod(QDialog*&, const char [12],     Qt::ConnectionType)'

我看到编译输出,错误信息是,

note:   no known conversion for argument 1 from 'QDialog*' to 'QObject*'

突然,我意识到我没有声明 Qdialog。 我认为 QT 有时不能给出非常好的编译错误输出。

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 2014-08-16
    • 1970-01-01
    • 2012-10-22
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多