2011-12-29 147 views
-1

我想使用boost :: ptr_vector,抽象的基类,但我得到编译错误。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.但是我怎么能得到一个二维数组?

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

什么是错误? – Anycorn 2011-12-29 03:33:44

+0

-1没有编译器错误消息,令人困惑的问题。你想克隆支持? – Marc 2011-12-30 01:14:14

+0

编译错误C2259:'Engine :: IPlot':无法实例化抽象类C:\ boost_1_48_0 \ boost \ ptr_container \ clone_allocator.hpp 34.它在我的POST中。 – user1120381 2011-12-30 04:05:34

回答

0

我的水晶球告诉我你正在使用resize。不要使用它,使用push_back或其他。

+0

请参阅更新后的帖子,谢谢。 – user1120381 2011-12-29 16:42:57