Vector Iterator: no match for ‘operator=’

c++, iterator, stdvector

Solution

`copyin` is a `const VipAddressSetEntity` and so `copyin.mVipAddressList` is also `const`. Calling `begin` on a `const std::vector<VipAddressEntity>` will give you an immutable iterator of type `std::vector<VipAddressEntity>::const_iterator`. Just make sure your `iter` is of that type too and you'll be able to assign to it just fine:

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

Problem

Considering the code C++ in the first code snippet below, I am getting the compilation errors indicated in the second snippet. It looks I am doing st wrong when traversing the vector instance. Can you tell me how I can overcome these compilation problems? Thanks. LINE 171 is marked in the code. SNIPPET 1 (Code) ``` #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 (Compilation output) ``` 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> >&’ ```

Original source