繁体   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