Как вставить const Obj в std :: list <T *>? - PullRequest
1 голос
/ 20 августа 2011

Я написал функцию

    void addAnything(T const &obj)
    {
    ...
    m_list.push_front(obj); // - line returns C2664 - list is initialized by std::list<T*> m_list
     ...
    }

, и моя проблема заключается в преобразовании из 'const T' в 'T * const'.И мне нужно вставить его в этот список ... = / Любой метод для вставки элементов в std :: list требует 'const T & x'.Есть ли способ вставить элемент const в мой список и сохранить параметр addAnything ()?Может быть, адаптировав m_list?

Спасибо за любой совет!

Ответы [ 5 ]

2 голосов
/ 20 августа 2011

У вас есть объект const, и вы пытаетесь вставить его в контейнер с не const указателями на не const объекты. Я предполагаю, что вы хотели использовать &obj, но даже тогда это не сработает: что, если obj будет временным? Вам нужно будет либо сделать obj a T&, либо сделать копию obj (возможно, с new) и нажать адрес этого.

Обратите внимание, что когда у вас есть контейнер T*, не всегда понятно, кому принадлежат T s. Если вы явно не хотите, чтобы контейнер стал владельцем (в этом случае отправка new ed - плохая идея), вы можете использовать boost::ptr_list<T>.

1 голос
/ 20 августа 2011

Есть две проблемы с вашим кодом: во-первых, вы нажимаете ссылку на объект, когда список ожидает указатель; во-вторых, ваш список требует неконстантного указателя. Вы можете решить вторую проблему, создав копию obj или изменив тип списка на std::list<const T*>.

// 1.
m_list.push_front(new T(obj)); // don't forget to delete it later

// 2.
std::list<const T*> m_list;
m_list.push_front(&obj);

Обратите внимание, что при втором способе вы должны убедиться, что obj действует до тех пор, пока вы храните указатель на него в m_list.

1 голос
/ 20 августа 2011

Попробуйте это:

m_list.push_front(new T(obj));
0 голосов
/ 20 августа 2011

Вам известно определение std :: list ? Вручную вы должны удалить объект, когда удаляется из списка. Я не чем заменить std :: list на std :: list .

0 голосов
/ 20 августа 2011
 m_list.push_front(obj); 
// - line returns C2664 - list is initialized by std::list<T*> m_list

Сообщение об ошибке сообщает, что m_list имеет тип std::list<T*>.Значение m_list может содержать элементы типа T*.Но вы нажимаете obj типа T&.Ссылки не являются указателями.

Есть ли способ вставить элемент const в мой список и сохранить параметр addAnything ()?Может быть, адаптировав m_list?

std::list<const T> m_list;
void addAnything( const T& obj ){
     m_list.push_front(obj);

     // ...

}
...