Opened 10 years ago
Last modified 10 years ago
#6981 new Bugs
Can't use boost::ptr_vector<T>::auto_type as data member in GCC 4.6
| Reported by: | Owned by: | Thorsten Ottosen | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | ptr_container |
| Version: | Boost 1.49.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
The following code failed to compile with g++ 4.6.3 on Ubuntu Linux 12.04 LTS.
#include <boost/noncopyable.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
class Test : boost::noncopyable
{
};
class Pool : boost::noncopyable
{
public:
Pool();
private:
boost::ptr_vector<Test>::auto_type p_;
};
Pool::Pool()
{
}
the error is
In file included from /usr/include/boost/ptr_container/detail/reversible_ptr_container.hpp:22:0,
from /usr/include/boost/ptr_container/ptr_sequence_adapter.hpp:20,
from /usr/include/boost/ptr_container/ptr_vector.hpp:20,
from ptr_vec.cc:2:
/usr/include/boost/ptr_container/detail/static_move_ptr.hpp:
In instantiation of 'boost::ptr_container_detail::static_move_ptr<Test, boost::ptr_container_detail::clone_deleter<...> >
::cant_move_from_const<const boost::ptr_container_detail::static_move_ptr<Test, boost::ptr_container_detail::clone_deleter<...> > >':
ptr_vec.cc:17:12: instantiated from here
/usr/include/boost/ptr_container/detail/static_move_ptr.hpp:168:57: error: no type named 'error' in 'class boost::ptr_container_detail::static_move_ptr<Test, boost::ptr_container_detail::clone_deleter<boost::ptr_container_detail::reversible_ptr_container<boost::ptr_container_detail::sequence_config<Test, std::vector<void*, std::allocator<void*> > >, boost::heap_clone_allocator>::null_clone_allocator<false> > >'
However, if I inline the constructor, it compiles fine.
class PoolOkay : boost::noncopyable
{
public:
PoolOkay()
{
// okay to inline constructor
}
private:
boost::ptr_vector<Test>::auto_type p_;
};
Note: there is no error when compiling with g++ 4.4.3
I am not sure if it's a bug of ptr_container or gcc itself.
Change History (2)
comment:1 by , 10 years ago
comment:2 by , 10 years ago
Workaround by declaring but not defining assignment operator and copy constructor.
class Pool
{
// ...
private:
void operator=(const Pool&);
Pool(const Pool&);
};
Looks like the error was trigger by compiler-generated copy ctor and/or assignment operator.
Worth mention that in the doc and put auto_type in regression tests, IMO.
Note:
See TracTickets
for help on using tickets.

update: the inline constructor is irrelevant, when I create an object of PoolOkay, the same error appears.