@QtRoS

C++, компилятор ведет себя странно или я что-то упустил?

Я не могу понять, почему данный код вызывает ошибку:
QNetworkRequest request();
request.setRawHeader("", "");

error: request for member 'setRawHeader' in 'request', which is of non-class type 'QNetworkRequest()'

Компилятор почему-то считает это объявлением типа функции. Вот еще пример
QString s = "test";
QNetworkRequest request(QUrl(s));
request.setRawHeader("", "");

error: request for member 'setRawHeader' in 'request', which is of non-class type 'QNetworkRequest(QUrl)

Рабочие варианты:
QUrl reqUrl(url);
QNetworkRequest req(reqUrl);

QNetworkRequest req(QUrl("some_url"));


G++ 4.9.2.
  • Вопрос задан
  • 3231 просмотр
Пригласить эксперта
Ответы на вопрос 4
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Первый пример - классическая ошибка, компилятор прав - вы действительно записали функцию.
Чтобы объявить класс и вызвать умолчательный конструктор, скобки ставить не нужно.
На этом даже Кармак прокатился:
The fact that ScopedLock lock() is a function declaration instead of an object constructor with no parms caused me great grief today.

Тот факт, что ScopedLock lock() является объявлением функции, а не вызовом конструктора без параметров вызвал у меня сегодня больше огорчение.
Ответ написан
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
К сожалению, для компилятора второй случай тоже похож на объявление функции.
Функции req принимающей один параметр (подробнее по ссылке).
Первый из предложенных вами вариантов -- отличный выход из этой ситуации. Еще можно написать так:
QNetworkRequest request((QUrl(s)));
Upd: нашел подробное описание этой ошибки от Мейерса.
Ответ написан
@TriKrista
В первом случае, вы объявили функцию, а не объект класса

Во втором случае, нет такой функции (setRawHeader(QSting, QString)).

Попробуйте так:
QString s = "test";
QNetworkRequest request(QUrl(s));
request.setRawHeader(QByteArray(""), QByteArray(""));


или так:
QNetworkRequest request;
request.setRawHeader("", "");
Ответ написан
MAKAPOH
@MAKAPOH
многостаночник
Вы можете использовать новый синтаксис универсальной инициализации, то есть вместо круглых скобок написать фигурные . Тут заметка про разница между объявлениями x1 и x2:
T x1; 
T x2();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы