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

Why do I get an error when calling front() on boost::ptr_list?

本文关键字:错误 调用 ptr boost list 为什么 front      更新时间:2023-10-16

我有一个虚拟类basic_action。类sippeers继承类basic_action。为了存储sippeers类的实例,我使用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类的指针插入ptr_list

最后一个字符串失败。

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

但是里面有basic_action *,而不是basic_action !

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

在这个例子中,它返回的是basic_action&

参见ptr_sequence_adapter的文档,ptr_list是从它派生出来的。

所以你的代码应该是:
boost::ptr_list<basic_action> ActionsList;
sippeers spclass;
ActionsList.push_back(&spclass);
basic_action &sp = ActionsList.front();

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();

如果你看一下标题,你会看到:

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();

是正确的。