C++ boost::ptr_向量和克隆对象

C++ boost::ptr_向量和克隆对象,c++,boost,C++,Boost,我试图使用boost::ptr_vector和一个抽象基类,但是我得到了编译错误 ///////////////////////////////////////////////////////////////////////// // Clonable concept ///////////////////////////////////////////////////////////////////////// template< class T > inline T* new

我试图使用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;
}
/////////////////////////////////////////////////////////////////////////
//可克隆概念
/////////////////////////////////////////////////////////////////////////
模板
内联T*新克隆(常量T&r)
{
//
//@备注:如果这里出现编译错误,
//很可能是因为你没有
//在名称空间中定义新的克隆(const T&)
//T。
//
T*res=新的T(r);
BOOST_断言(typeid(r)=typeid(*res)&&
“默认新建_clone()切片对象!”);
返回res;
}
我不明白为什么我需要提供克隆功能。这就是我想要指针向量的全部原因。它应该复制指针,而不需要克隆函数



我想我已经发现了问题所在。实际上我想要一个指针的2d向量,所以我做了一个boost::ptr_向量的std::vector。但我认为ptr_向量复制构造函数执行对象的深度复制,因此会出现错误?在下面的代码中,如果我取消注释任何一行,我会得到编译错误C2259:“Engine::IPlot”:无法实例化抽象类C:\boost\u 1\u 48\u 0\boost\ptr\u container\clone\u 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));
        }
    }
}
类世界:公共IWorld
{
公众:
世界(常量引擎::打印和绘图大小);
虚拟世界();
虚拟常量引擎::PairInt&GetPlotSize()常量;
虚拟引擎::IPlot*GetPlot(引擎::PairInt-coord);
虚拟常量引擎::IPlot*GetPlot(引擎::PairInt-coord)常量;
受保护的:
typedef std::vector>绘图;
绘图图;
常量引擎::PairInt plot\u大小;
};
世界::世界(常量打印和绘图大小)
:绘图大小(绘图大小)
//,plot_map(GetPlotSize().y)
{
PairInt plot_size=GetPlotSize();
//绘图图保留区(绘图图尺寸y);
对于(int y=0;y());
对于(int x=0;x
我的水晶球告诉我您正在使用
调整大小
。不要使用它,使用push_back或类似的方法。

-1没有编译器错误消息,这是一个令人困惑的问题。是否需要克隆支持?编译错误C2259:“引擎::IPlot”:无法实例化抽象类C:\boost\u 1\u 48\u 0\boost\ptr\u container\clone\u allocator.hpp 34。在我的帖子里,我不需要克隆支持。我想要一个指针向量,向量在分解时会自动删除指针。我正在尝试使用boost ptr_vector,这让我对我不熟悉的克隆支持感到困扰,因此我提出了这个问题。我已经弄明白了,ptr_向量复制构造函数需要克隆,因为我有一个二维数组的ptr_向量。使用ptr_向量或ptr_向量。使用ptr_图。在1d向量上使用手动索引。