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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: reference to temporary  (Прочитано 6250 раз)
0...-5
Гость
« : Апрель 11, 2011, 19:38 »

Проблема такая: в классе имеются в переменные следующего вида:
QMap<int, QList<int> > data_map
int data_ind

Далее объявляю метод:
const QList<int>& data() {return data_map[data_ind];}

на что получаю предупреждение при сборке:
returning reference to temporary.

Скажите, где тут временные переменные?
И самое интересное: если из метода убрать модификаторы const, то никаких предупреждений при сборке не выдается!
« Последнее редактирование: Апрель 12, 2011, 07:06 от 0...-5 » Записан
alexman
Гость
« Ответ #1 : Апрель 11, 2011, 20:14 »

QMultiMap
Записан
0...-5
Гость
« Ответ #2 : Апрель 11, 2011, 20:40 »

QMultiMap
Теперь еще и ошибка: оператор [] является закрытым для этого класса))
Записан
minigo
Гость
« Ответ #3 : Апрель 11, 2011, 21:51 »

наверно вот так для начала const QList<int>& data() {return data_map[data_ind];}.

Но 2010 студия не выдаёт такой варнинг (сборка на варнинг левел 3). Ещё вот http://msdn.microsoft.com/en-us/library/a8kfxa78(VS.71).aspx

но конечно лучше увидеть код целиком.
Записан
0...-5
Гость
« Ответ #4 : Апрель 11, 2011, 22:07 »

наверно вот так для начала const QList<int>& data() {return data_map[data_ind];}.

Но 2010 студия не выдаёт такой варнинг (сборка на варнинг левел 3). Ещё вот http://msdn.microsoft.com/en-us/library/a8kfxa78(VS.71).aspx

но конечно лучше увидеть код целиком.

Мне нужен именно метод const
Записан
Fat-Zer
Гость
« Ответ #5 : Апрель 12, 2011, 00:19 »

1) как уже говорили нужен QMultiMap
2) используйте values() вместо operator[]
3) посмотрите на тип восвращаемого значения оператора [] и вам откроется, что было не так...
Записан
mutineer
Гость
« Ответ #6 : Апрель 12, 2011, 00:43 »

QMultiMap

В чем смысл тут мультимап делать? Он же нигде не говорил что ключи повторяются


Мне нужен именно метод const

Ты амперсанд не там поставил
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 12, 2011, 02:05 »

Далее объявляю метод:
const QList<int> data()& {return data_map[data_ind];}

на что получаю предупреждение при сборке:
returning reference to temporary.
Точнее с &, непонятно что Вы хотели

Так все нормально
Код
C++ (Qt)
const QList<int> & data() {return data_map[data_ind];}
 

А так должны получить
Код
C++ (Qt)
const QList<int> & data() const {return data_map[data_ind];}
 
Записан
0...-5
Гость
« Ответ #8 : Апрель 12, 2011, 06:42 »

Цитировать
Ты амперсанд не там поставил
По поводу амперсанта все действительно так, я когда писал сообщение в тему поставил его не в нужное место, но от предупреждение это естественное не лечит.

Цитировать
1) как уже говорили нужен QMultiMap
2) используйте values() вместо operator[]
3) посмотрите на тип восвращаемого значения оператора [] и вам откроется, что было не так...
Насчет QMultiMap – это забавно, насколько я знаю это просто подкласс для хранения неуникальных пар ключ – значение.
Выдержка методов из документации:
QList<T> QMap::values (const key & key) const
То есть не возвращает ссылки, а возвращает список копий. Мне нужны именно ссылки.
Скорее всего проблема в том, что оператор [] возвращает неконстантную ссылку либо константную копию

Уточнение про амперсант:
Мне нужен метод, не модифицирующий класс при вызове и возвращающий немодифицируемую ссылку (в данном случае на список интов)
« Последнее редактирование: Апрель 12, 2011, 06:45 от 0...-5 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 12, 2011, 06:55 »

По поводу амперсанта все действительно так, я когда писал сообщение в тему поставил его не в нужное место, но от предупреждение это естественное не лечит.
Так подправьте свой первый пост чтобы не было конфузу

Мне нужен метод, не модифицирующий класс при вызове и возвращающий немодифицируемую ссылку (в данном случае на список интов)
Если метод const, то ссылку не получить по той причине что в ассоциативном контейнере ее может просто не быть. Но можно удовлетвориться константным указателем

Код
C++ (Qt)
const QList<int> * data( void ) const
{
 QMap<int, QList<int> >::const_iterator it = data_map.find(data_ind);
 return (it == data_map.end()) ? 0 : &it.value();
}
И затем обыграть возвращаемый 0
Записан
0...-5
Гость
« Ответ #10 : Апрель 12, 2011, 07:06 »

По поводу амперсанта все действительно так, я когда писал сообщение в тему поставил его не в нужное место, но от предупреждение это естественное не лечит.
Так подправьте свой первый пост чтобы не было конфузу

Мне нужен метод, не модифицирующий класс при вызове и возвращающий немодифицируемую ссылку (в данном случае на список интов)
Если метод const, то ссылку не получить по той причине что в ассоциативном контейнере ее может просто не быть. Но можно удовлетвориться константным указателем

Код
C++ (Qt)
const QList<int> * data( void ) const
{
 QMap<int, QList<int> >::const_iterator it = data_map.find(data_ind);
 return (it == data_map.end()) ? 0 : &it.value();
}
И затем обыграть возвращаемый 0


Была такая мысля)))
Не смейтесь, просто мне приятнее работать со списком через [], а так придется пользовать at()
)))))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Апрель 12, 2011, 07:34 »

Была такая мысля)))
Не смейтесь, просто мне приятнее работать со списком через [], а так придется пользовать at()
)))))
Так приведите к ссылке
Код
C++ (Qt)
typedef QList<int> TIntList;
...
const TIntList * lstPtr = data();
if (!lstPtr) return;
const TIntList & lst = *lstPtr;
if (lst.size() && lst[0] == 1) ...
}
Записан
0...-5
Гость
« Ответ #12 : Апрель 12, 2011, 08:30 »

Спасибо)))))Это лишние телодвижения, оставлю все в указателях
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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