如何将'const Obj'插入std :: list <t *>?</t *>

时间:2011-08-20 01:41:45

标签: c++ list const containers std

我写了一个函数

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

我的问题是从'T * const'中的'const T'转换。我需要将它插入到这个列表中... = /任何将元素插入std :: list的方法都需要'const T&amp; X'。 有没有办法将const项插入我的列表并保留addAnything()的参数? 也许通过改编m_list?

任何建议的Thx!

5 个答案:

答案 0 :(得分:2)

您有一个const对象,并且您正在尝试将其插入到非const对象的非const指针的容器中。我假设您打算使用&obj,但即便如此,这也行不通:如果obj是暂时的,该怎么办?您需要将obj设为T&,或制作obj的副本(可能带有new)并推送该地址。

请注意,当您拥有T*的容器时,并不总是清楚谁拥有T s。除非您明确不希望容器取得所有权(在这种情况下,推送new ed事件是个坏主意),您可能希望使用boost::ptr_list<T>

答案 1 :(得分:1)

试试这个:

m_list.push_front(new T(obj));

答案 2 :(得分:1)

您的代码有两个问题:首先,当列表需要指针时,您正在推送对象引用;第二,你的列表需要一个非const指针。您可以通过创建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有效。

答案 3 :(得分:0)

 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的{​​{1}}。引用不是指针。

  

有没有办法将const项插入我的列表并保留addAnything()的参数?也许通过改编m_list?

T&

答案 4 :(得分:0)

你知道std :: list&lt; T *&gt;定义?从列表中删除对象时,应手动删除对象。 我不是替换std :: list&lt; T *&gt;与std :: list&lt; T&gt;。