2015-11-10 102 views
-6

我試圖從矢量工具中刪除一個對象。爲什麼這段代碼壞了

我的代碼是:從Wezel.h

vector<Wezel <int> > wektor; 

int main() 
{ 

Wezel<int> parent = Wezel<int>(true,"p1", 1); 
Wezel<int> child1 = Wezel<int>(true,"ch1", 2); 
Wezel<int> child2 = Wezel<int>(true,"ch2", 3); 
Wezel<int> child3 = Wezel<int>(true,"ch3", 4); 
Wezel<int> child4 = Wezel<int>(true,"ch4", 5); 

parent.addWezel(&child1); 

child1.addWezel(&child2); 

child3.addWezel(&parent); 

child4.addWezel(&child1); 

wektor.push_back(parent); 
wektor.push_back(child1); 
wektor.push_back(child2); 
wektor.push_back(child3); 
wektor.push_back(child4); 


child4.substractWezel(&child1){ 
tablica->erase(remove(tablica->begin(), tablica->end(), *child), tablica- >end()); 
    } 

    return 0; 
} 

代碼:

template <class T> 
class Wezel 
{ 
public: 
    Wezel<T>& operator=(const Wezel<T>& obj); 
    Wezel<T> operator+(const Wezel<T>& obj); 
    Wezel<T>& operator==(const Wezel<T>& obj); 
// Wezel<T> operator!(); 

    Wezel(bool skierowany, string nazwa, T wartosc) 
    { 
     this->tablica = new vector<Wezel<T> >[4]; 
     this->wartosc = wartosc; 
     this->skierowany = skierowany; 
     this->nazwa = nazwa; 
    } 

    Wezel(const Wezel &wezel){ 
     this->tablica = wezel.tablica; 
     this->wartosc = wezel.wartosc; 
     this->skierowany = wezel.skierowany; 
     this->nazwa = wezel.nazwa; 
    } 



    ~Wezel<T>(){ 


    } 
     T getWartosc(){ 
     return wartosc; 
    } 

    void setWartosc(T wartosc){ 
     this->wartosc = wartosc; 
    } 


    vector<Wezel<T> > getTablica(){ 
     return *tablica; 
    } 

    void setTablica(vector<Wezel<T> > *tablica){ 
     this->tablica = tablica; 
    } 

    void addWezel(Wezel<T> *child){ 

     if(getTablicaSize() == getTablicaMaxSize()){ 
      cout << "tablica pelna, nie mozna dodac wezla" << endl; 
      return; 
     } 


     tablica->push_back(*child); 

     if(!skierowany){ 
      if(child->getTablicaSize() == child->getTablicaMaxSize()){ 
       cout << "tablica pelna, nie mozna dodac wezla" << endl; 
      return; 
      } 
      child->getTablica().push_back(*this); 
     } 

     } 

     void substractWezel(Wezel *child){ 


    tablica->erase(tablica->begin()+1, *child); 


    tablica->erase(remove(tablica->begin(), tablica->end(), *child), tablica->end()); 


    string getNazwa(){ 
     return this->nazwa; 
    } 


protected: 
private: 
    vector<Wezel<T> > *tablica = new vector<Wezel<T> >[4]; 
    T wartosc; 
    bool skierowany; 
    string nazwa; 

    int getTablicaMaxSize(){ 
     return this->tablica->max_size(); 
    } 

    int getTablicaSize(){ 
     return this->tablica->size(); 
    } 

    }; 
    template <typename T> 
    ostream& operator << (ostream& os, const Wezel<T>& obj) 
    { 
     return os << obj; 
    } 

    template <typename T> 
    Wezel<T> Wezel<T>::operator + (const Wezel<T>& obj) 
    { 
    Wezel<T> tmp_obj = *this; 
    tmp_obj.wartosc = tmp_obj.wartosc + obj.wartosc; 
    tmp_obj.nazwa = tmp_obj.nazwa + obj.nazwa; 
    return tmp_obj; 

    } 


    template <class T> 

    Wezel<T>& Wezel<T>::operator = (const Wezel<T> & obj) 

    { 
     wartosc = obj.wartosc; 
     nazwa = obj.nazwa; 
     tablica = obj.tablica; 
     skierowany = obj.skierowany; 
     return *this; 
    } 
    template<class T> 
    Wezel<T>& Wezel<T>::operator==(const Wezel<T>& obj) { /* ... */ } 

    #endif // WEZEL_H 

和編譯器顯示的錯誤是:

錯誤:不對應的 '操作員!'在 '!(& __first .__ gnu_cxx :: __ normal_iterator < _Iterator,_container> ::運算**,性病::矢量>>()) - >韋策爾:: ==操作符((* & __value))' |

請幫忙。

+1

請更清楚:你想做什麼以及整個編譯器輸出是什麼? 此外,代碼的最後一部分丟失。 – bznein

+0

我的英語不是很好。我基本上試圖擦除和矢量對象。 只看整個程序會更容易 http://speedy.sh/ZGDXX/graf.rar – Consigliere

+3

http://stackoverflow.com/help/mcve –

回答

1

它說,Wezel<int>::operator==不存在。並且std::remove需要它找到要刪除的內容。

+0

所以我需要重載==運算符? – Consigliere

+1

@notkink從'std :: remove'文檔:_The函數使用operator ==比較各個elements_。所以是的,你需要重載'operator ==' – BlackDwarf

+0

絕對。 'template Wezel :: operator ==(const Wezel &other){/ * ... * /}' – YSC