错误推回对const向量元素的引用

时间:2012-12-06 17:47:08

标签: c++ vector const

请考虑以下事项:

// from main file

// first arguement gets enc_array
Rock rock (voice.getEncArray());
// getEncArray() gets a vector of vectors:
// std::vector<std::vector<unsigned int> > enc_array;

// in rock.hpp file, consider members
Rock( const std::vector<std::vector<unsigned int> > &);

std::vector<std::vector<unsigned int> * > remaining;

const std::vector<std::vector<unsigned int> > * population;

// in rock.cpp
Rock::Rock ( const vector<vector<unsigned int> > & v) :
  population (&v),
  ....

// in one of the class member functions
for ( vector<vector<unsigned int> >::const_iterator ci = population->begin(); ci != population->end(); ++ci ) {
    // for some indexes...
    remaining.push_back (& (*ci));      // <------  PROBLEM
}

gcc报道:

error: no matching function for call to 'std::vector<std::vector<unsigned int>*>::push_back(const std::vector<unsigned int>*)'

note: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::vector<unsigned int>*; _Alloc = std::allocator<std::vector<unsigned int>*>; std::vector<_Tp, _Alloc>::value_type = std::vector<unsigned int>*] <near match>

note:   no known conversion for argument 1 from 'const std::vector<unsigned int>*' to 'std::vector<unsigned int>* const&'

我了解到我正在尝试将vector<int>的{​​{1}}地址推送到非常量const。 填充vector后,没有其他方法会更改其数据,因此实际上它应该是remaining。 但我无法将const声明为remaining,因为它会出错。

const vector

我是否真的需要将error: no matching function for call to 'std::vector<std::vector<unsigned int>*>::push_back(const std::vector<unsigned int>*) const' note: candidate is: note: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::vector<unsigned int>*; _Alloc = std::allocator<std::vector<unsigned int>*>; std::vector<_Tp, _Alloc>::value_type = std::vector<unsigned int>*] <near match> note: no known conversion for argument 1 from 'const std::vector<unsigned int>*' to 'std::vector<unsigned int>* const&' 中的元素复制到population?或者我还能做些什么来避免这种开销?

2 个答案:

答案 0 :(得分:2)

您正在使用population元素的地址,以后可以更改它。这很糟糕,因为您已将population指定为const

如果要更改const的元素,则应从population定义中删除iterator关键字,然后使用const_iterator代替population

答案 1 :(得分:1)

尝试

std::vector<const std::vector<unsigned int> *> remaining;