LINUX.ORG.RU

Не могу закомпилить простую конструкцию с QNetworkRequest / QNetworkReply

 , , qnetworkrequest,


0

1

Имеется следующий код:

    MapGraphicsNetwork * network = MapGraphicsNetwork::getInstance();

    QString fetchURL;
    ...
    QNetworkRequest request(QUrl(fetchURL));

    QNetworkReply * reply = network->get(request);

Ошибка на последней строчке такая:
../../MapGraphicsSrc/MapGraphics/tileSources/OSMTileSource.cpp: In member function ‘virtual void OSMTileSource::fetchTile(quint32, quint32, quint8)’:
../../MapGraphicsSrc/MapGraphics/tileSources/OSMTileSource.cpp:121:49: error: no matching function for call to ‘MapGraphicsNetwork::get(QNetworkRequest (&)(QUrl))’
     QNetworkReply * reply = network->get(request);
                                                 ^
In file included from ../../MapGraphicsSrc/MapGraphics/tileSources/OSMTileSource.cpp:3:0:
../../MapGraphicsSrc/MapGraphics/guts/MapGraphicsNetwork.h:15:21: note: candidate: QNetworkReply* MapGraphicsNetwork::get(QNetworkRequest&)
     QNetworkReply * get(QNetworkRequest& request);
                     ^~~
../../MapGraphicsSrc/MapGraphics/guts/MapGraphicsNetwork.h:15:21: note:   no known conversion for argument 1 from ‘QNetworkRequest(QUrl)’ to ‘QNetworkRequest&’

Кратко говоря, проблема в том, что «no known conversion for argument 1 from ‘QNetworkRequest(QUrl)’ to ‘QNetworkRequest&’». Видимо, по какой-то причине невозможно получить ссылку на вполне себе обычный объект QNetworkRequest. Почему так, не могу разобраться.

Если это важно, вот прототип метода get:
QNetworkReply * get(QNetworkRequest& request);

★★★★★

Ответ на: комментарий от pon4ik

QNetworkRequest request(QUrl(fetchURL));
QNetworkRequest(QUrl)

Похоже скорее на most vexing parse.

Надо переписать как-нибудь, варианты (первые два зависят от конструкторов, третий от версии стандарта):

QNetworkRequest request(fetchURL);
QNetworkRequest request = QUrl(fetchURL);
QNetworkRequest request{QUrl(fetchURL)};
QNetworkRequest request((QUrl(fetchURL)));

xaizek ★★★★★
()

Хм, прочитал внимательней, rvalue то нет. Возможно, компиль счёл обьявление

QNetworkRequest request(QUrl(fetchURL));

Прототипом функции. Но тоже странно. Одна фигня, попробуй переписать на

QNetworkRequest request = QNetworkRequest(QUrl(fetchURL));
pon4ik ★★★★★
()
Ответ на: комментарий от xaizek

Ещё, возможно дело в том, что на какой то из объектов, есть только forward declaration, поэтому решение было принято в пользу того, что это сигнатура функции.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

forward declaration не должно влиять, так как подобные конфликты всегда разрешаются в сторону функций (для совместимости, видимо).

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Понятно.


The line

TimeKeeper time_keeper(Timer());

is seemingly ambiguous, since it could be interpreted either as:

- a variable definition for variable time_keeper of class TimeKeeper, initialized with an anonymous instance of class Timer or
- a function declaration for a function time_keeper that returns an object of type TimeKeeper and has a single (unnamed) parameter that is a pointer to function returning type Timer (and taking no input). (See Function object#In C and C++)

Most programmers expect the first, but the C++ standard requires it to be interpreted as the second.


Синтаксис у плюсов настолько уработали, что возникают такие грэбли.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Синтаксис у плюсов настолько уработали, что возникают такие грэбли.

Не в данном случае. Этот синтаксис пришёл из C, где он однозначный так как там нету конструкторов.

xaizek ★★★★★
()

«фигурные скобки для вызова конструктора - беспроигрышный вариант»

Именно так выглядело мое сообщение изначально. Но потом я вспомнил про vector.

	std::vector<int> v{5};
	std::cout << v.size() << "\n"; // 1
	std::vector<int> v(5);
	std::cout << v.size() << "\n"; // 5
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.