Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ruzik от Июнь 19, 2012, 21:35



Название: Объясните почему так
Отправлено: ruzik от Июнь 19, 2012, 21:35
Здравствуйте есть код:
Код:
    QString urlOfFile = ....;
    QNetworkAccessManager _manager;
    QNetworkRequest request(QUrl(urlOfFile));
    _manager.get(request);
И на него выдается следующая ошибка:
D:\my_projects\RizekFaster\Classes\RFileDownloader\RFileDownloader.cpp:32: ошибка: no matching function for call to 'QNetworkAccessManager::get(QNetworkRequest (&)(QUrl))'
candidates are: QNetworkReply* QNetworkAccessManager::get(const QNetworkRequest&)
А если подкорректировать так, то все нормально:
Код:
    QString urlOfFile = ....;
    QNetworkAccessManager _manager;
    QNetworkRequest request = QNetworkRequest(QUrl(urlOfFile));
    _manager.get(request);
Я понимаю, чего хочет компилятор, но не понимаю почему старый вариант его не устроил а новый устроил
Заранее спасибо!


Название: Re: Объясните почему так
Отправлено: Igors от Июнь 20, 2012, 02:23
Код
C++ (Qt)
QNetworkRequest request(QUrl(urlOfFile));
 
Он понимает это как объявление прототипа ф-ции (где urlOfFile - имя аргумента), а не объявление переменной. Замените urlOfFile на что-нибудь от фонаря, напр foo - на этой строке все равно ошибок не будет.
Избавиться можно всяко, напр
Код
C++ (Qt)
QUrl url(urlOfFile);
QNetworkRequest request(url);
 


Название: Re: Объясните почему так
Отправлено: ruzik от Июнь 20, 2012, 22:26
Простите, но если я не ошибаюсь то прототип такой функции должен бы был выглядеть примерно так:
QNetworkRequest request(QUrl urlOfFile);
А не так:
QNetworkRequest request(QUrl(urlOfFile));
Замена с именем не прокатывает - та же ошибка.
А если использовать способ предложенный вами:
Код:
QUrl url(urlOfFile);
QNetworkRequest request(url);
То выдает следующую ошибку:
D:\my_projects\RizekFaster\Classes\RFileDownloader\RFileDownloader.cpp:31: ошибка: declaration of 'QUrl url' shadows a parameter


Название: Re: Объясните почему так
Отправлено: Alex Custov от Июнь 20, 2012, 23:08
какие-то конфликты имён. Минимальный компилируемый код где это воспроизводится в студию.


Название: Re: Объясните почему так
Отправлено: mutineer от Июнь 20, 2012, 23:25
В функции случайно нет параметра с именем url?


Название: Re: Объясните почему так
Отправлено: Igors от Июнь 21, 2012, 09:58
Замена с именем не прокатывает - та же ошибка.
А если использовать способ предложенный вами:
Код:
QUrl url(urlOfFile);
QNetworkRequest request(url);
То выдает следующую ошибку:
D:\my_projects\RizekFaster\Classes\RFileDownloader\RFileDownloader.cpp:31: ошибка: declaration of 'QUrl url' shadows a parameter
Конечно та же ошибка, но заметьте что компилятор ничего не сказал на foo - которое нигде не объявлено. И конечно если у Вас уже есть переменная url, то надо дать др имя

Простите, но если я не ошибаюсь то прототип такой функции должен бы был выглядеть примерно так:
QNetworkRequest request(QUrl urlOfFile);
А не так:
QNetworkRequest request(QUrl(urlOfFile));
Из того что "обычно мы делаем так" еще не следует что "по-другому нельзя".
Код
C++ (Qt)
#include <QtGui>
 
void Test( int( foo ) )
{
qDebug() << foo;
}
 
int main( void )
{
Test(100);
return 0;
}
 
Компилится?  :)


Название: Re: Объясните почему так
Отправлено: ruzik от Июнь 21, 2012, 21:22
Действительно был конфликт имен, который я просмотрел.
еще раз большое спасибо за помощь!


Название: Re: Объясните почему так
Отправлено: Alex Custov от Июнь 22, 2012, 15:03
Код
C++ (Qt)
QNetworkRequest request(QUrl(urlOfFile));
 
Он понимает это как объявление прототипа ф-ции (где urlOfFile - имя аргумента), а не объявление переменной.

"Этого не может быть, этого не может быть? этого не может быть" - бормотал Киса. Скорее всего тут конфликт имён. Функция объявляется если нет агрументов, а тут обычный конструктор с параметрами.


Название: Re: Объясните почему так
Отправлено: Igors от Июнь 22, 2012, 15:33
"Этого не может быть, этого не может быть? этого не может быть" - бормотал Киса. Скорее всего тут конфликт имён. Функция объявляется если нет агрументов, а тут обычный конструктор с параметрами.
Нет тут никакого конфликта имен. В любом cpp файле после инклудов (чтобы были видны QNetworkRequest и QUrl) вставьте строку

Код
C++ (Qt)
QNetworkRequest request(QUrl(any_name_here));

Никакой ошибки не будет, хотя  any_name_here никак не объявлен. А icc вообще внятно говорит что то ф-ция. Можно и проще, напр

Код
C++ (Qt)
int Test(QString(foo)):


Название: Re: Объясните почему так
Отправлено: Alex Custov от Июнь 22, 2012, 15:48
То ли я С++ уже забываю... Про такие функции я помню, но почему вот это

Код
C++ (Qt)
   QString any_name_here("http://ya.ru");
   QNetworkRequest request(QUrl(any_name_here));
 
   request.setRawHeader("123", "444");
 

Создаёт функцию, а

Код
C++ (Qt)
   QNetworkRequest request(QUrl("http://ya.ru"));
 
   request.setRawHeader("123", "444");
 

объект?


Название: Re: Объясните почему так
Отправлено: mutineer от Июнь 22, 2012, 15:49
То ли я С++ уже забываю... Про такие функции я помню, но почему вот это

Код
C++ (Qt)
   QString any_name_here("http://ya.ru");
   QNetworkRequest request(QUrl(any_name_here));
 
   request.setRawHeader("123", "444");
 

Создаёт функцию, а

Код
C++ (Qt)
   QNetworkRequest request(QUrl("http://ya.ru"));
 
   request.setRawHeader("123", "444");
 

объект?

Потому что "http://ya.ru" компилятор не примет за имя параметра функции, а any_name_here за имя параметра вполне сойдет