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

How to insert 'const Obj' into std::list<T*>?

本文关键字:lt list gt 插入 const Obj std      更新时间:2023-10-16

我写了一个函数

    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&x"。有没有办法将常量项插入我的列表中并保留 addAnything(( 的参数?也许通过适应m_list?

感谢任何建议!

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

请注意,当你有一个T*容器时,并不总是清楚谁拥有其中的T。 除非您明确不希望容器获得所有权(在这种情况下,推送new ed 的东西是一个坏主意(,否则您可能希望使用 boost::ptr_list<T> .

试试这个:

m_list.push_front(new T(obj));

您的代码存在两个问题:首先,当列表需要指针时,您正在推送对象引用; 其次,您的列表需要一个非常量指针。您可以通过创建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);

请注意,使用第二种方法时,只要在 m_list 中存储指向它的指针,就必须确保 obj 有效。

你知道std::list<T*>的定义吗?从列表中删除对象时,应手动删除对象。我不会用std::list替换std::list

 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&.引用不是指针。

有没有办法将常量项插入我的列表中并保留 addAnything(( 的参数?也许通过适应m_list?

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