2012-12-06 31 views
2

請考慮以下幾點:錯誤推回參考常量向量的元素

// 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>地址const轉換爲非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&' 

我真的需要從​​元素複製到remaining?或者還有什麼我可以做的,爲了不有這種開銷?

+0

嘗試'iterator',而不是'const_iterator'。 – Synxis

+0

@Synxis:不可能,因爲'population'被定義爲'const'(轉換問題...) – Luis

回答

1

嘗試

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

您正在接受​​元素的地址,並可稍後進行更改。這很糟糕,因爲您指定​​爲const

您應該刪除從​​定義const關鍵字,然後用iterator代替const_iterator,如果你想改變的​​元素。

+1

+1用於教導如何釣魚而不是給魚。 – mrz