首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化多态指针容器

初始化多态指针容器
EN

Stack Overflow用户
提问于 2011-05-09 19:28:33
回答 4查看 945关注 0票数 4

我可以用boost::ptr_vector初始化多态boost::assign::list_of吗?

代码语言:javascript
复制
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/assign/list_of.hpp>

boost::ptr_vector<Animal> ls = boost::assign::list_of(new Ant)(new Bee)(new Cat);

这不能编译:

代码语言:javascript
复制
error: no match for call to '(boost::assign_detail::generic_list<Ant*>) (Bear*)'

boost::ptr_vector<Animal>替换为std::vector<Animal*>会产生同样的错误。

两个人建议手动将模板参数Animal*提供给list_of

代码语言:javascript
复制
boost::assign::list_of<Animal*>(new Ant)(new Bear)(new Cat)

但它仍然不起作用:

代码语言:javascript
复制
boost/ptr_container/ptr_sequence_adapter.hpp: In static member function 'static boost::ptr_container_detail::sequence_config<T, VoidPtrSeq>::U* boost::ptr_container_detail::sequence_config<T, VoidPtrSeq>::get_const_pointer(Iter) [with Iter = std::_Deque_iterator<Animal*, Animal*&, Animal**>, T = Animal, VoidPtrSeq = std::vector<void*, std::allocator<void*> >, boost::ptr_container_detail::sequence_config<T, VoidPtrSeq>::U = Animal]':
boost/ptr_container/detail/reversible_ptr_container.hpp:95:71:   instantiated from 'static boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::Ty_* boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::null_clone_allocator<allow_null_values>::allocate_clone_from_iterator(Iter) [with Iter = std::_Deque_iterator<Animal*, Animal*&, Animal**>, bool allow_null_values = false, Config = boost::ptr_container_detail::sequence_config<Animal, std::vector<void*, std::allocator<void*> > >, CloneAllocator = boost::heap_clone_allocator, boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::Ty_ = Animal]'
boost/ptr_container/detail/scoped_deleter.hpp:70:21:   instantiated from 'boost::ptr_container_detail::scoped_deleter<T, CloneAllocator>::scoped_deleter(InputIterator, InputIterator) [with InputIterator = std::_Deque_iterator<Animal*, Animal*&, Animal**>, T = Animal, CloneAllocator = boost::ptr_container_detail::reversible_ptr_container<boost::ptr_container_detail::sequence_config<Animal, std::vector<void*, std::allocator<void*> > >, boost::heap_clone_allocator>::null_clone_allocator<false>]'
boost/ptr_container/detail/reversible_ptr_container.hpp:212:44:   instantiated from 'void boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::clone_back_insert(ForwardIterator, ForwardIterator) [with ForwardIterator = std::_Deque_iterator<Animal*, Animal*&, Animal**>, Config = boost::ptr_container_detail::sequence_config<Animal, std::vector<void*, std::allocator<void*> > >, CloneAllocator = boost::heap_clone_allocator]'
boost/ptr_container/detail/reversible_ptr_container.hpp:303:13:   instantiated from 'void boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::constructor_impl(I, I, std::forward_iterator_tag) [with I = std::_Deque_iterator<Animal*, Animal*&, Animal**>, Config = boost::ptr_container_detail::sequence_config<Animal, std::vector<void*, std::allocator<void*> > >, CloneAllocator = boost::heap_clone_allocator]'
boost/ptr_container/detail/reversible_ptr_container.hpp:378:13:   instantiated from 'boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::reversible_ptr_container(InputIterator, InputIterator, boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::allocator_type&) [with InputIterator = std::_Deque_iterator<Animal*, Animal*&, Animal**>, Config = boost::ptr_container_detail::sequence_config<Animal, std::vector<void*, std::allocator<void*> > >, CloneAllocator = boost::heap_clone_allocator, boost::ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::allocator_type = std::allocator<void*>]'
boost/ptr_container/ptr_sequence_adapter.hpp:178:36:   instantiated from 'boost::ptr_sequence_adapter<T, VoidPtrSeq, CloneAllocator>::ptr_sequence_adapter(InputIterator, InputIterator) [with InputIterator = std::_Deque_iterator<Animal*, Animal*&, Animal**>, T = Animal, VoidPtrSeq = std::vector<void*, std::allocator<void*> >, CloneAllocator = boost::heap_clone_allocator]'
boost/ptr_container/ptr_vector.hpp:45:9:   instantiated from 'boost::ptr_vector<T, CloneAllocator, Allocator>::ptr_vector(InputIterator, InputIterator) [with InputIterator = std::_Deque_iterator<Animal*, Animal*&, Animal**>, T = Animal, CloneAllocator = boost::heap_clone_allocator, Allocator = std::allocator<void*>]'
boost/assign/list_of.hpp:163:46:   instantiated from 'Container boost::assign_detail::converter<DerivedTAssign, Iterator>::convert(const Container*, boost::assign_detail::default_type_tag) const [with Container = boost::ptr_vector<Animal>, DerivedTAssign = boost::assign_detail::generic_list<Animal*>, Iterator = std::_Deque_iterator<Animal*, Animal*&, Animal**>]'
boost/assign/list_of.hpp:142:54:   instantiated from 'Container boost::assign_detail::converter<DerivedTAssign, Iterator>::convert_to_container() const [with Container = boost::ptr_vector<Animal>, DerivedTAssign = boost::assign_detail::generic_list<Animal*>, Iterator = std::_Deque_iterator<Animal*, Animal*&, Animal**>]'
boost/assign/list_of.hpp:436:81:   instantiated from 'boost::assign_detail::generic_list<T>::operator Container() const [with Container = boost::ptr_vector<Animal>, T = Animal*]'
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-09 19:36:26

我试试看。我认为list_of是一个正在推导模板参数的模板。因为您的参数类型是一个派生类,所以它认为它是容器类型。兄弟班不匹配。

您可能必须显式提供模板参数,如下所示:

代码语言:javascript
复制
boost::ptr_vector<Animal> ls = boost::assign::list_of<Animal*>(new Ant)(new Bee)(new Cat);
票数 5
EN

Stack Overflow用户

发布于 2011-05-09 20:21:47

您不应该使用list_of来分配以提升指针集合。如果其中一个构造函数抛出,已经构造的实例尚未添加到容器中,也不会被list_of删除(它需要值,而不是多态类型)。

Boost.Assignment提供了ptr_list_of()。但是,该元素只能添加同构元素(相同类型的元素)。

因此,我认为Boost.Assignment对于异构集合并不真正有用。

票数 3
EN

Stack Overflow用户

发布于 2011-05-10 11:17:12

如果允许两步初始化,boost::assign::push_back可能满足以下目的:

代码语言:javascript
复制
ptr_vector<Animal> ls;
assign::push_back( ls )(new Ant)(new Bee)(new Cat);

不幸的是,我不知道一个简单的方法来完成一步初始化。如果我们像下面这样准备一些转换器,可能可以完成一个步骤的初始化。

代码语言:javascript
复制
template< class T >
struct converter : std::vector< T > {
  template< class Container >
  operator Container() const {
    Container c;
    for ( const_iterator i = begin(), e = end();  i != e;  ++ i )
      c.push_back( *i );
    return c;
  }
};

template< class T >
converter< typename T::value_type > convert( T const& x ) {
  converter< typename T::value_type > c;
  c.assign( x.begin(), x.end() );
  return c;
}

ptr_vector<Animal> ls =
  convert( assign::list_of<Animal*>(new Ant)(new Bee)(new Cat) );

但这可能会很长..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5941512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档