Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: 0...-5 от Апреля 11, 2011, 19:38



Название: reference to temporary
Отправлено: 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, то никаких предупреждений при сборке не выдается!


Название: Re: reference to temporary
Отправлено: alexman от Апреля 11, 2011, 20:14
QMultiMap


Название: Re: reference to temporary
Отправлено: 0...-5 от Апреля 11, 2011, 20:40
QMultiMap
Теперь еще и ошибка: оператор [] является закрытым для этого класса))


Название: Re: reference to temporary
Отправлено: minigo от Апреля 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

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


Название: Re: reference to temporary
Отправлено: 0...-5 от Апреля 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


Название: Re: reference to temporary
Отправлено: Fat-Zer от Апреля 12, 2011, 00:19
1) как уже говорили нужен QMultiMap
2) используйте values() вместо operator[]
3) посмотрите на тип восвращаемого значения оператора [] и вам откроется, что было не так...


Название: Re: reference to temporary
Отправлено: mutineer от Апреля 12, 2011, 00:43
QMultiMap

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


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

Ты амперсанд не там поставил


Название: Re: reference to temporary
Отправлено: Igors от Апреля 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];}
 


Название: Re: reference to temporary
Отправлено: 0...-5 от Апреля 12, 2011, 06:42
Цитировать
Ты амперсанд не там поставил
По поводу амперсанта все действительно так, я когда писал сообщение в тему поставил его не в нужное место, но от предупреждение это естественное не лечит.

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

Уточнение про амперсант:
Мне нужен метод, не модифицирующий класс при вызове и возвращающий немодифицируемую ссылку (в данном случае на список интов)


Название: Re: reference to temporary
Отправлено: Igors от Апреля 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


Название: Re: reference to temporary
Отправлено: 0...-5 от Апреля 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()
)))))


Название: Re: reference to temporary
Отправлено: Igors от Апреля 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) ...
}


Название: Re: reference to temporary
Отправлено: 0...-5 от Апреля 12, 2011, 08:30
Спасибо)))))Это лишние телодвижения, оставлю все в указателях