2015-03-25 97 views
0
int CRegister::CountCars(const string& name, const string& surname)const{ 
const pair<string,string> wholename(name,surname); 
vector<CDriver>::iterator Diterator=lower_bound(m_Drivers.begin(),m_Drivers.end(),wholename); 
if (Diterator<m_Drivers.end()){ 
    if(Diterator->m_name.compare(wholename.first)!=0 || Diterator->m_surname.compare(wholename.second)!=0) return 0; 
    return Diterator->m_DriversNumber; 
} 
return 0; 
} 

您好,當我嘗試編譯這一點,它拋出第三行錯誤:const和非const方法之間的區別?

"conversion from ‘__gnu_cxx::__normal_iterator<const CDriver*, std::vector<CDriver> >’ to non-scalar type ‘std::vector<CDriver>::iterator {aka __gnu_cxx::__normal_iterator<CDriver*, std::vector<CDriver> >}’ requested 

當我設定的功能CountCars作爲非const,它編譯沒有問題。我應該改變什麼來解決這個問題? (該功能必須是常量)

+0

您是否嘗試過使用const_iterator? – mathematician1975 2015-03-25 08:09:31

回答

3

解決你的問題,你必須使用一個常量性

原因如下:該方法被標記爲常量,這意味着該方法本身不會改變該方法被調用的對象實例的狀態。

因此,在const方法中,您不能在未標記爲const的同一對象上調用任何其他方法。因爲當然,新的調用並不保證它是const,所以第一個方法可以不聲稱是const了。

通過聲明迭代器const,您將使用lower_bound的const版本。

1

嘗試使用const_iterator

vector<CDriver>::const_iterator Diterator 
//    ^^^^^^ 
+0

這正是你爲什麼通常使用'auto'來處理這些事情的原因。 – Angew 2015-03-25 08:16:00

1

考慮使用const_iterator,例如,

vector<CDriver>::const_iterator Diterator 
    = lower_bound(m_Drivers.begin(), m_Drivers.end(), wholename); 

如果可以編譯在C++ 11/14,使用auto有助於以及:

auto Diterator = lower_bound(m_Drivers.begin(), m_Drivers.end(), wholename); 

(隨着auto,編譯器推斷出正確的迭代器類型,而不需要正確地「拼寫「明確代碼。)

相關問題