Название: 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];}. Мне нужен именно метод constНо 2010 студия не выдаёт такой варнинг (сборка на варнинг левел 3). Ещё вот http://msdn.microsoft.com/en-us/library/a8kfxa78(VS.71).aspx но конечно лучше увидеть код целиком. Название: 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. Так все нормально Код
А так должны получить Код
Название: Re: reference to temporary Отправлено: 0...-5 от Апреля 12, 2011, 06:42 Цитировать Ты амперсанд не там поставил По поводу амперсанта все действительно так, я когда писал сообщение в тему поставил его не в нужное место, но от предупреждение это естественное не лечит.Цитировать 1) как уже говорили нужен QMultiMap Насчет QMultiMap – это забавно, насколько я знаю это просто подкласс для хранения неуникальных пар ключ – значение.2) используйте values() вместо operator[] 3) посмотрите на тип восвращаемого значения оператора [] и вам откроется, что было не так... Выдержка методов из документации: QList<T> QMap::values (const key & key) const То есть не возвращает ссылки, а возвращает список копий. Мне нужны именно ссылки. Скорее всего проблема в том, что оператор [] возвращает неконстантную ссылку либо константную копию Уточнение про амперсант: Мне нужен метод, не модифицирующий класс при вызове и возвращающий немодифицируемую ссылку (в данном случае на список интов) Название: Re: reference to temporary Отправлено: Igors от Апреля 12, 2011, 06:55 По поводу амперсанта все действительно так, я когда писал сообщение в тему поставил его не в нужное место, но от предупреждение это естественное не лечит. Так подправьте свой первый пост чтобы не было конфузуМне нужен метод, не модифицирующий класс при вызове и возвращающий немодифицируемую ссылку (в данном случае на список интов) Если метод const, то ссылку не получить по той причине что в ассоциативном контейнере ее может просто не быть. Но можно удовлетвориться константным указателемКод И затем обыграть возвращаемый 0 Название: Re: reference to temporary Отправлено: 0...-5 от Апреля 12, 2011, 07:06 По поводу амперсанта все действительно так, я когда писал сообщение в тему поставил его не в нужное место, но от предупреждение это естественное не лечит. Так подправьте свой первый пост чтобы не было конфузуМне нужен метод, не модифицирующий класс при вызове и возвращающий немодифицируемую ссылку (в данном случае на список интов) Если метод const, то ссылку не получить по той причине что в ассоциативном контейнере ее может просто не быть. Но можно удовлетвориться константным указателемКод И затем обыграть возвращаемый 0 Была такая мысля))) Не смейтесь, просто мне приятнее работать со списком через [], а так придется пользовать at() ))))) Название: Re: reference to temporary Отправлено: Igors от Апреля 12, 2011, 07:34 Была такая мысля))) Так приведите к ссылкеНе смейтесь, просто мне приятнее работать со списком через [], а так придется пользовать at() ))))) Код
Название: Re: reference to temporary Отправлено: 0...-5 от Апреля 12, 2011, 08:30 Спасибо)))))Это лишние телодвижения, оставлю все в указателях
|