【问题标题】:How to insert 'const Obj' into std::list<T*>?如何将 'const Obj' 插入 std::list<T*>?
【发布时间】:2011-10-31 00:54:06
【问题描述】:

我写了一个函数

    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'。 有没有办法在我的列表中插入一个 const 项并保留 addAnything() 的参数? 也许通过调整 m_list?

感谢您的任何建议!

【问题讨论】:

    标签: c++ list constants containers std


    【解决方案1】:

    试试这个:

    m_list.push_front(new T(obj));
    

    【讨论】:

      【解决方案2】:
       m_list.push_front(obj); 
      // - line returns C2664 - list is initialized by std::list<T*> m_list
      

      错误消息告诉您m_list 的类型为std::list&lt;T*&gt;。意思是,m_list 可以容纳T* 类型的元素。但是您正在推送obj,它的类型为T&amp;。引用不是指针。

      有没有办法在我的列表中插入一个 const 项并保留 addAnything() 的参数?也许通过调整 m_list?

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

      【讨论】:

        【解决方案3】:

        您的代码有两个问题:首先,当列表需要指针时,您正在推送对象引用;其次,您的列表需要一个非常量指针。您可以通过创建obj 的副本或将列表的类型更改为std::list&lt;const T*&gt; 来解决第二个问题。

        // 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 中时有效。

        【讨论】:

        • 第二个不行
        • @dnikku:显然,存储指向临时对象的指针是个坏主意。不过,这对我的代码来说不是问题。
        【解决方案4】:

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

        【讨论】:

        • "用 std::list 替换 std::list" -- 这是什么意思?
        • @Sevis:阅读更准确:用 std::list 替换 std::list - 存储对象而不是指针 - 正确吗?
        • @user903325:我的评论是在编辑之前,这确实澄清了这个问题。但是,std::list&lt;T*&gt; 和std::list&lt;T&gt; 的语义非常不同;在大多数情况下,它们是不可互换的。
        【解决方案5】:

        您有一个const 对象,并且您正试图将其插入到一个包含非const 指向非const 对象的指针的容器中。我假设您打算使用&amp;obj,但即便如此,这也行不通:如果obj 是临时的怎么办?您需要将obj 设为T&amp;,或复制obj(可能与new)并推送地址。

        请注意,当您拥有T* 的容器时,并不总是清楚谁拥有其中的Ts。除非您明确不希望容器获得所有权(在这种情况下,推送newed 是个坏主意),否则您可能需要使用boost::ptr_list&lt;T&gt;。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          • 2021-06-02
          • 2021-06-11
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          相关资源
          最近更新 更多