C++ 常量和非常量方法之间的区别? int CRegister::CountCars(常量字符串和名称、常量字符串和姓氏)常量{ const pair wholename(姓名、姓氏); vector::iterator-Diterator=下限(m_-Drivers.begin()、m_-Drivers.end()、wholename); 如果(数据项名称比较(wholename.first)!=0 |数据项名称->m|u姓氏比较(wholename.second)!=0)返回0; 返回数据采集器->m_驱动器编号; } 返回0; }

C++ 常量和非常量方法之间的区别? int CRegister::CountCars(常量字符串和名称、常量字符串和姓氏)常量{ const pair wholename(姓名、姓氏); vector::iterator-Diterator=下限(m_-Drivers.begin()、m_-Drivers.end()、wholename); 如果(数据项名称比较(wholename.first)!=0 |数据项名称->m|u姓氏比较(wholename.second)!=0)返回0; 返回数据采集器->m_驱动器编号; } 返回0; },c++,vector,type-conversion,constants,C++,Vector,Type Conversion,Constants,您好,当我试图编译此文件时,它在第三行抛出错误: 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(

您好,当我试图编译此文件时,它在第三行抛出错误:

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;
}
“请求从“\uuuu gnu\u cxx::\uuu normal\u iterator”转换为非标量类型“std::vector::iterator{aka uuu gnu\u cxx::\uu normal\u iterator}”

当我将函数CountCars设置为非常量时,它编译时不会出现问题。我应该更改什么来解决这个问题?(函数必须是常量)

尝试使用
常量迭代器

"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
向量::常量迭代器迭代器 // ^^^^^^
尝试使用
常量迭代器

"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
向量::常量迭代器迭代器 // ^^^^^^
要解决问题,必须使用常量迭代器

原因如下:该方法标记为const,这意味着该方法本身不会更改调用该方法的对象实例的状态

因此,在一个const方法中,您不能对同一个未标记为const的对象调用任何其他方法。因为新的调用不能保证它是const,所以第一个方法不能再声明为const


通过声明迭代器常量,您将使用下限的常量版本。

要解决您的问题,您必须使用常量迭代器

原因如下:该方法标记为const,这意味着该方法本身不会更改调用该方法的对象实例的状态

因此,在一个const方法中,您不能对同一个未标记为const的对象调用任何其他方法。因为新的调用不能保证它是const,所以第一个方法不能再声明为const


通过声明迭代器常量,您将使用下限的常量版本。

考虑使用
常量迭代器,例如

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

(使用
auto
,编译器推断出正确的迭代器类型,而无需您在代码中显式地正确“拼写”它。)

考虑使用
常量迭代器

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

(使用
auto
,编译器推断出正确的迭代器类型,而无需您在代码中显式地“拼写”它。)

您是否尝试过使用常量迭代器?您是否尝试过使用常量迭代器?这正是您通常使用
auto
进行此类操作的原因。这正是您通常使用
auto
进行此类操作的原因。