2015-11-10 168 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