簡體   English   中英

const和非const方法之間的區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM