2014-05-21 27 views
2

我已經改變了我的代碼使用爲什麼boost :: ptr_vector的訪問元素嘗試實例化新對象?

std::vector<A*> 

到使用

boost::ptr_vector<A> 

,並碰到了一個問題。

下面的代碼:

class A 
{ 
protected: 
    virtual int getNumber() {return 1;}; 

public: 

    static int getSum(boost::ptr_vector<A> &pv){ 
     int sum = 0; 
     for(std::vector<int>::size_type i = 0; i != pv.size(); i++) { 
      sum += pv[i].getNumber(); 
     } 
     return sum; 
    } 

    virtual ~A(void)=0; 
} 

現在,由於更改爲ptr_vector,我得到一個編譯錯誤:

error C2259: 'A' : cannot instantiate abstract class 
due to following members: 
'A::~A(void)' : is abstract 

上線

sum += pv[1].getNumber(); 

這是我第一次使用ptr_vector的時候如此原諒我,如果我失去了明顯的東西,但爲什麼它試圖實例化,以及如何避免ED?

+0

如果您可以顯示創建A對象並將其分配給ptr_vector的代碼,這將會很有幫助。 –

+0

任何可以重現問題的[sscce](http://www.sscce.org/)的機會?我[嘗試](http://coliru.stacked-crooked.com/a/bea89e4c6ac9fc6f)重現編譯器錯誤,但無法這樣做。 –

回答

0

有些評論是在正確的問題其實躺在那裏A對象正在創建中。

我有一個類,B,它有ptr_vector作爲成員。 B只使用派生自A的對象填充矢量,這很好。

問題出現時,B的副本製成。由於A不可複製,這導致了錯誤。

3

您不能爲類使用純虛擬的和未定義的析構函數,而是希望以多態方式使用它。 ptr_vector應該清除其內容(默認策略是在指針上調用delete,即調用析構函數的對象,所以應該定義析構函數)。

嘗試類聲明(或CPP文件)後,定義它像

A::~A() {} 

n3376 12.4/9

A destructor can be declared virtual (10.3) or pure virtual (10.4); if any objects of that class or any derived class are created in the program, the destructor shall be defined.

+0

它與矢量一起工作,因爲矢量不擔心創建/刪除。但是,從有限的代碼示例中,PV可以很容易地保存從A派生的對象並定義一個有效的析構函數。因此,我仍然不清楚爲什麼這不能編譯。 –

相關問題