Russian Qt Forum
Ноябрь 25, 2024, 00:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объясните почему так  (Прочитано 6129 раз)
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);
Я понимаю, чего хочет компилятор, но не понимаю почему старый вариант его не устроил а новый устроил
Заранее спасибо!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июнь 20, 2012, 02:23 »

Код
C++ (Qt)
QNetworkRequest request(QUrl(urlOfFile));
 
Он понимает это как объявление прототипа ф-ции (где urlOfFile - имя аргумента), а не объявление переменной. Замените urlOfFile на что-нибудь от фонаря, напр foo - на этой строке все равно ошибок не будет.
Избавиться можно всяко, напр
Код
C++ (Qt)
QUrl url(urlOfFile);
QNetworkRequest request(url);
 
Записан
ruzik
Гость
« Ответ #2 : Июнь 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
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Июнь 20, 2012, 23:08 »

какие-то конфликты имён. Минимальный компилируемый код где это воспроизводится в студию.
Записан
mutineer
Гость
« Ответ #4 : Июнь 20, 2012, 23:25 »

В функции случайно нет параметра с именем url?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 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;
}
 
Компилится?  Улыбающийся
Записан
ruzik
Гость
« Ответ #6 : Июнь 21, 2012, 21:22 »

Действительно был конфликт имен, который я просмотрел.
еще раз большое спасибо за помощь!
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Июнь 22, 2012, 15:03 »

Код
C++ (Qt)
QNetworkRequest request(QUrl(urlOfFile));
 
Он понимает это как объявление прототипа ф-ции (где urlOfFile - имя аргумента), а не объявление переменной.

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

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 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)):
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Июнь 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");
 

объект?
Записан
mutineer
Гость
« Ответ #10 : Июнь 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 за имя параметра вполне сойдет
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.206 секунд. Запросов: 23.