【问题标题】:Passing QUrl to a QNetworkRequest constructor causes "non-class type" compiler errors将 QUrl 传递给 QNetworkRequest 构造函数会导致“非类类型”编译器错误
【发布时间】:2013-10-30 18:09:14
【问题描述】:

当我将 QUrl 传递给 QNetworkRequest 构造函数时,编译器会出现奇怪的错误。更奇怪的是它只发生在特定的情况下,这里有一个例子:

#include <QCoreApplication>
#include <QNetworkReply>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString str;

    QNetworkRequest req(QUrl(str));
    req.setUrl(QUrl(str)); // error: request for member 'setUrl' in 'req', which is of non-class type 'QNetworkRequest ()(QUrl)'

    QNetworkRequest req2(QUrl(QString("http://google.com"))); // works here perfectly!
    req2.setUrl(QUrl(str));

    QNetworkRequest req3;
    req3.setUrl(QUrl(str));

    QUrl url(str);
    QNetworkRequest req4(url);
    req4.setUrl(QUrl(str));

    return a.exec();
}

g++-4.2 说:

main.cpp:11: error: request for member 'setUrl' in 'req', which is of non-class type 'QNetworkRequest ()(QUrl)'

vs2010 编译器说:

error C2228: left of '.setUrl' must have class/struct/union

当我想将“损坏”的 QNetworkRequest 传递给 QNetworkAccessManager::get 方法时,我从 vs2010 得到了额外的解释:

error C2664: 'QNetworkAccessManager::get' : cannot convert parameter 1 from 'QNetworkRequest (__cdecl *)(QUrl)' to 'const QNetworkRequest &'
      Reason: cannot convert from 'overloaded-function' to 'const QNetworkRequest'
      No constructor could take the source type, or constructor overload resolution was ambiguous

多么奇怪..有人知道吗?也许我只是忘记了如何编程..

【问题讨论】:

    标签: c++ visual-studio-2010 qt4 g++


    【解决方案1】:

    您遇到了所谓的“令人烦恼的解析”。这个:

    QNetworkRequest req(QUrl(str));
    

    等价于

    QNetworkRequest req(QUrl str);
    

    这是一个函数声明。

    要声明一个变量并从一个临时变量中初始化它,你需要

    QNetworkRequest req{QUrl{str}};                    // C++11
    QNetworkRequest req = QNetworkRequest(QUrl(str));  // Historic C++ (if it's copyable)
    

    或使用命名变量而不是临时变量,就像使用 req4 一样。

    【讨论】:

    • +1 我不明白为什么我每次都会错过这一点,所以我的回答是无关紧要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2022-01-24
    相关资源
    最近更新 更多