2013-02-22 12 views
5

以下の最初のコードスニペットのC++コードを考慮すると、2番目のスニペットに示されているコンパイルエラーが発生しています。私は、ベクトルインスタンスをトラバースするときに間違っているように見えます。これらのコンパイルの問題をどのように克服できるか教えてください。ありがとう。コードにはライン171が記されています。ベクトルイテレータ: 'operator ='に一致しません

この行で

SNIPPET 1(コード)

#include <string> 
#include <vector> 
#include <iterator> 

class VipAddressSetEntity : BaseEntity 
{ 
public: 
     VipAddressSetEntity() : BaseEntity() { } 
     VipAddressSetEntity(std::string &uuid, std::string &name) : BaseEntity(uuid, name) { } 

     VipAddressSetEntity(const VipAddressSetEntity &copyin) 
     { 
     setUUID(copyin.getUUID()); 
     setName(copyin.getName()); 

     std::vector<VipAddressEntity>::iterator iter; 
       /* LINE 171 is the following*/ 
     for(iter = copyin.mVipAddressList.begin(); iter != copyin.mVipAddressList.end(); iter++) 
     { 
       addVipAddress(*iter); 
     } 
     } 

     VipAddressSetEntity operator = (const VipAddressSetEntity &rhs) 
     { 
     setUUID(rhs.getUUID()); 
     setName(rhs.getName()); 

     std::vector<VipAddressEntity>::iterator iter; 
     for(iter = rhs.mVipAddressList.begin(); iter != rhs.mVipAddressList.end(); iter++) 
     { 
       addVipAddress(*iter); 
     } 

     return *this; 
     } 

     void addVipAddress(VipAddressEntity &entity) 
     { 
     mVipAddressList.push_back(entity); 
      } 

     VipAddressEntity & getVipAddress(std::string uuid) 
     { 
     std::vector<VipAddressEntity>::iterator iter; 
     for(iter = mVipAddressList.begin(); iter != mVipAddressList.end(); iter++) 
     { 
      if(iter->getUUID() == uuid) 
      { 
       return *iter; 
      } 
     } 

      return NULL; 
     } 


     const std::vector<VipAddressEntity>& getVipAddressList() const { return mVipAddressList; } 


private: 
    std::vector<VipAddressEntity> mVipAddressList; 

}; 

SNIPPET 2(コンパイル出力)

Entity.hpp: In copy constructor ‘ECLBCP::VipAddressSetEntity::VipAddressSetEntity(const ECLBCP::VipAddressSetEntity&)’: 
Entity.hpp:171:44: error: no match for ‘operator=’ in ‘iter = copyin.ECLBCP::VipAddressSetEntity::mVipAddressList.std::vector<_Tp, _Alloc>::begin<ECLBCP::VipAddressEntity, std::allocator<ECLBCP::VipAddressEntity> >()’ 
Entity.hpp:171:44: note: candidates are: 
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:68:0, 
        from /usr/include/c++/4.7/bits/char_traits.h:41, 
        from /usr/include/c++/4.7/string:42, 
        from Entity.hpp:11: 
/usr/include/c++/4.7/bits/stl_iterator.h:710:11: note: __gnu_cxx::__normal_iterator<ECLBCP::VipAddressEntity*, std::vector<ECLBCP::VipAddressEntity> >& __gnu_cxx::__normal_iterator<ECLBCP::VipAddressEntity*, std::vector<ECLBCP::VipAddressEntity> >::operator=(const __gnu_cxx::__normal_iterator<ECLBCP::VipAddressEntity*, std::vector<ECLBCP::VipAddressEntity> >&) 
/usr/include/c++/4.7/bits/stl_iterator.h:710:11: note: no known conversion for  argument 1 from ‘std::vector<ECLBCP::VipAddressEntity>::const_iterator {aka __gnu_cxx::__normal_iterator<const ECLBCP::VipAddressEntity*, std::vector<ECLBCP::VipAddressEntity> >}’ to ‘const __gnu_cxx::__normal_iterator<ECLBCP::VipAddressEntity*, std::vector<ECLBCP::VipAddressEntity> >&’ 

答えて

6

copyinは、const VipAddressSetEntityであり、従って、copyin.mVipAddressListconstである。 const std::vector<VipAddressEntity>beginを呼び出すと、タイプstd::vector<VipAddressEntity>::const_iteratorの不変イテレータが得られます。ちょうどあなたのiterがあまりにもその型であることを確認し、あなただけの罰金、それに割り当てることができるようになります:

std::vector<VipAddressEntity>::const_iterator iter; 
2

for(iter = copyin.mVipAddressList.begin(); iter != copyin.mVipAddressList.end(); iter++) 

あなたはstd::vector<VipAddressEntity>::iteratorを割り当てることはできませんcopyinがconstなのでcopyin.mVipAddressList.begin()から代わりにconst_iteratorを使用してください。

2

copyinはconst参照です。反復にはconst_iteratorを使用する必要があります。

関連する問題