为什么在boost :: ptr_list上调用front()时会出错?

时间:2011-04-11 10:16:51

标签: c++

我有一个虚拟课程basic_action。类sippeers继承了类basic_action。存储我正在使用sippeers的{​​{1}}个类的实例。这是代码示例:

boost::ptr_list

在这里,我创建了一个boost::ptr_list<basic_action> ActionsList; sippeers spclass; ActionsList.push_back(&spclass); basic_action *sp = ActionsList.front(); 实例,其中包含指向prt_list类实例的指针。 接下来,我将创建basic_action类的新实例。 接下来,我将sippeers类的指针插入sippeers

最后一个字符串失败。

  

无法从'basic_action'转换为   'basic_action *'。

但内部有一个ptr_list,而不是basic_action *

3 个答案:

答案 0 :(得分:5)

boost::ptr_list::front()返回对模板化类型的引用,而不是指针。

所以在这种情况下,它返回basic_action&

请参阅ptr_sequence_adapter的文档hereptr_list派生自boost::ptr_list<basic_action> ActionsList; sippeers spclass; ActionsList.push_back(&spclass); basic_action &sp = ActionsList.front();

所以你的代码应该是:

{{1}}

答案 1 :(得分:2)

ptr_list :: front()返回对列表中第一个对象的引用。 如果basic_action是具体类型,则可以满足以下两个条件。

// 1
basic_action& sp = ActionsList.front();

// 2
basic_action sp = ActionsList.front();

#1会使sp成为对列表中第一个对象的引用。换句话说,您通过sp进行的任何更改也会更改列表中的第一个对象。

#2将实例化一个新的basic_action对象,并将列表中第一个对象的内容复制到这个新对象中。对它的任何更改都不会影响列表中的第一项。

如果basic_action是一个抽象类选项,那么#2将不再可用,因为您无法实例化抽象类对象。

另外,您不应将堆栈分配的对象放入boost指针容器中。当ptr_list超出范围并尝试删除它包含的所有对象时,会发生错误。而是做类似的事情:

boost::ptr_list<basic_action> ActionsList;
ActionsList.push_back(new sippeers);
basic_action& sp = ActionsList.front();

答案 2 :(得分:0)

如果查看header,您会看到:

template
<
    class T,
    class VoidPtrSeq,
    class CloneAllocator = heap_clone_allocator
>
class ptr_sequence_adapter
{
public: // construct/copy/destroy
    template< class InputIterator >
    assign( InputIterator first, InputIterator last );
    template< class InputRange >
    assign( const InputRange& e );

public: // element access
    T&        front();

(注意; ptr_list直接继承自ptr_sequence_adapter)所以你得到的是类型,而不是对类型的引用;它会为您自动取消引用:

basic_action sp = ActionsList.front();

是对的。