为什么在boost::ptr_list上调用front()时会出现错误?
Why do I get an error when calling front() on boost::ptr_list?
我有一个虚拟类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();
是正确的。
- C++ 结构错误"调用'erase'没有匹配函数
- 错误:调用 .. at return 语句时没有匹配函数
- 从C++代码抛出错误调用 JavaScript 回调函数 - nbind
- 错误:调用"make_pair"没有匹配函数
- 错误:调用 std::thread 没有匹配函数
- SFML 中的分段错误 调用 sf::窗口::关闭后
- 错误:调用函数指针没有匹配函数
- 汇编错误:调用基本型构造函数时无效的转换
- 错误:调用计数器::计数器()没有匹配函数
- C++ 通过函数指针错误调用成员函数
- 错误:调用 cargaison::cargaison() 时没有匹配函数
- 简单矩阵类,错误:调用私有构造函数
- 带有返回类型的错误调用模板到会员函数
- 错误:调用没有匹配函数(无法解决?
- 从 C 代码链接错误调用C++函数(使用 gcc 进行链接)
- 错误:调用 'pybind11::buffer_info::buffer_info 没有匹配函数
- 错误:调用terminate引发exceptionAbort陷阱:6
- 错误调用功能无法转换类型
- C++ 中的文件处理错误 - 调用"std::basic_fstream<char, std::char_traits<char> >::open(const char[8],
- 对成员函数set_value的错误调用是不明确的(在 xcode 中使用 pugixml 库)