5

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

奇妙だ..誰か手がかりを持っていますか?プログラミングの仕方を忘れてしまったのかもしれません。

4

1 に答える 1

10

いわゆる「厄介な解析」に遭遇しました。これ:

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

于 2013-10-30T19:05:46.327 に答える