Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не удается перегрузка оператора >>, через QDataStream 
V
    Опции темы
Atiskara
Дата 10.4.2014, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



есть некая структура.
Код

struct mydata{
    quint32 dataId;
    quint16 dataLen;
    quint8 dataVer;
    quint8 dataErr;
}

и есть класс, в котором объявляю в h файле
Код

friend QDataStream &operator >>(QDataStream &out, mydata &data);


в cpp
Код

QDataStream &operator >>(QDataStream &out, mydata &data){
    out >> data.dataId;
    out >> data.dataLen;
    out >> data.dataVer;
    out >> data.dataErr;
    return out;
}


и когда вызываю перегруженный оператор, компилятор отказывается понимать
Код

        QByteArray data;
        ....//здесь происходит инициализация data
        mydata* mydata_;
        QDataStream dataStream(&data,QIODevice::ReadOnly);
        dataStream.setVersion((QDataStream::Qt_4_8);
        dataStream >> mydata_;


Код

error: no match for 'operator>>' in 'dataStream >> ((MyClass*)this)->MyClass::mydata_'


где у меня не так сделано?

Это сообщение отредактировал(а) Atiskara - 10.4.2014, 18:33
PM MAIL   Вверх
feodorv
Дата 10.4.2014, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: нет
Всего: 45



Цитата(Atiskara @  10.4.2014,  19:23 Найти цитируемый пост)
QDataStream &operator >>(QDataStream &out, mydata &data)

Цитата(Atiskara @  10.4.2014,  19:23 Найти цитируемый пост)
        mydata* mydata_;




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Atiskara
Дата 11.4.2014, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



не-а. если писать mydata mydata_, тоже не работает. ошибка аналогичная
PM MAIL   Вверх
Guinness
Дата 11.4.2014, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Atiskara, т.е. это не сработает?
Код

mydata mydata_;
dataStream >> mydata_;

PM MAIL   Вверх
Atiskara
Дата 11.4.2014, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Guinness, 
ага, не работает
PM MAIL   Вверх
Guinness
Дата 11.4.2014, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Atiskara @  10.4.2014,  19:23 Найти цитируемый пост)
и есть класс, в котором объявляю в h файле

А почему данная строка объявляется в каком-то абстрактном классе? Хидер с этим классом добавлен в исходник с примером использования QDataStream?
PM MAIL   Вверх
Atiskara
Дата 11.4.2014, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



добавлен.
myclass.h
Код

class MyClass{
public:
   MyClass();
   friend QDataStream &operator >>(QDataStream &out, mydata &data);

private:
   void dataProcessing();

protected:
  mydata mydata_
}



myclass.cpp
Код

#include "myclass.h"
#include <QDataStream>
MyClass(){...}

void MyClass::dataProcessing(){
        QByteArray data;
        ....//здесь происходит инициализация data
        mydata mydata_;
        QDataStream dataStream(&data,QIODevice::ReadOnly);
        dataStream.setVersion((QDataStream::Qt_4_8);
        dataStream >> mydata_;
}

QDataStream &operator >>(QDataStream &out, mydata &data){
    out >> data.dataId;
    out >> data.dataLen;
    out >> data.dataVer;
    out >> data.dataErr;
    return out;
}

PM MAIL   Вверх
Guinness
Дата 11.4.2014, 10:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Atiskara, косяк в том, что компилятор не может обнаружить функцию:
Код

QDataStream &operator >>(QDataStream &out, mydata &data);

Прикол здесь заключается в том, что запись в классе:
Код

class MyClass{
public:
    ...
    friend QDataStream &operator >>(QDataStream &out, mydata &data);
    ...
};

не объявлет саму функцию, а лишь говорит, что функция с такой сигнатурой является другом данного класса. Далее есть три выхода из данной ситуации:
1) Поставить тело функции operator>> до dataProcessing.
2) Сделать объявление функции после класса:
class MyClass{
public:
    ...
    friend QDataStream &operator >>(QDataStream &out, mydata &data);
    ...
};
 QDataStream &operator >>(QDataStream &out, mydata &data);
[/code]
3). Перенести в более подходящее место и не делать другом, потому что в данной ситации не понятно, почему эта функция друг класса MyClass.
PM MAIL   Вверх
Atiskara
Дата 11.4.2014, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



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

Добавлено через 3 минуты и 29 секунд
Цитата(Guinness @ 11.4.2014,  10:53)
1) Поставить тело функции operator>> до dataProcessing.

ой.. вот она, вся магия здесь заключается.
и правда, во вчерашней версии тело переопределения в самом конце было задано

Добавлено через 8 минут и 27 секунд
Guinness, делать функцию френдом подсказал гугл, хотя если вынести за пределы класса, тоже норм компилится.
В общем, спасибо огромнейшее
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.