我正在尝试使用boost :: ptr_vector,使用抽象基类,但是我遇到了编译错误。
/////////////////////////////////////////////////////////////////////////
// Clonable concept
/////////////////////////////////////////////////////////////////////////
template< class T >
inline T* new_clone( const T& r )
{
//
// @remark: if you get a compile-error here,
// it is most likely because you did not
// define new_clone( const T& ) in the namespace
// of T.
//
T* res = new T( r );
BOOST_ASSERT( typeid(r) == typeid(*res) &&
"Default new_clone() sliced object!" );
return res;
}
我不明白为什么我需要提供克隆功能。这就是我想要一个指针向量的全部原因。它应该复制指针而不需要克隆函数。
我想我发现了问题。我实际上想要一个2d指针向量,所以我创建了一个boost :: ptr_vector的std :: vector。但我认为它是ptr_vector复制构造函数执行对象的深层复制,因此错误?在下面的代码中,如果我取消注释任何一行,我得到编译错误C2259:'Engine :: IPlot':无法实例化抽象类C:\ boost_1_48_0 \ boost \ ptr_container \ clone_allocator.hpp 34.但我怎么能得到一个2d阵列?
class World : public IWorld
{
public:
World(const Engine::PairInt& plot_size);
virtual ~World();
virtual const Engine::PairInt& GetPlotSize() const;
virtual Engine::IPlot *GetPlot(Engine::PairInt coord);
virtual const Engine::IPlot *GetPlot(Engine::PairInt coord) const;
protected:
typedef std::vector< boost::ptr_vector< IPlot > > PlotMap;
PlotMap plot_map;
const Engine::PairInt plot_size;
};
World::World(const PairInt& plot_size_in)
: plot_size(plot_size)
//, plot_map(GetPlotSize().y)
{
PairInt plot_size = GetPlotSize();
//plot_map.reserve(plot_size.y);
for (int y = 0; y < plot_size.y; y++)
{
//plot_map.push_back(boost::ptr_vector< IPlot >());
for (int x = 0; x < plot_size.x; x++)
{
plot_map[y].reserve(plot_size.x);
plot_map[y].push_back(IPlot::Create(Vector2(PairInt(x, y).ToVector2()), true));
}
}
}
答案 0 :(得分:0)
我的水晶球告诉我你正在使用resize
。不要使用它,使用push_back等。