Передача QUrl в конструктор QNetworkRequest вызывает ошибки компилятора типа "неклассируемый тип"

когда я передаю 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();
}
</qnetworkreply></qcoreapplication>

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

Как странно.. у кого есть ключ? Возможно, я просто забыл, как программировать.

1 ответ

Вы столкнулись с так называемым "неприятным анализом". Это:

QNetworkRequest req(QUrl(str));

эквивалентно

QNetworkRequest req(QUrl str);

который является объявлением функции.

Чтобы объявить переменную и инициализировать ее из временной, вам нужно

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

или используйте именованную переменную, а не временную, как и для req4.

licensed under cc by-sa 3.0 with attribution.