[英]Difference between const and non-const method?
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;
}
您好,當我嘗試編譯它時,它在第三行上引發錯誤:
"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)
要解決您的問題,您必須使用const_iterator
原因如下:該方法被標記為const,這意味着該方法本身不會更改在其上調用該方法的對象實例的狀態。
因此,在const方法中,您不能在未標記const的同一對象上調用任何其他方法。 當然,因為新調用不保證它是const,所以第一種方法不能再聲明為const。
通過聲明迭代器const,您將使用Lower_bound的const版本。
嘗試使用const_iterator
:
vector<CDriver>::const_iterator Diterator
// ^^^^^^
考慮使用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
,編譯器將推導正確的迭代器類型,而無需您在代碼中明確地將其“拼寫”正確。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.