问题描述
我有这段代码尝试使用 count
迭代器调用 std::string
,但由于编译错误而失败。
#include <iostream>
#include <algorithm>
int count(std::string::iterator iter,char ch)
{
int n = 0;
while (*iter == ch) {
n++;
iter++;
}
return n;
}
void search(std::string const& str,char ch)
{
auto iter = std::find(str.begin(),str.end(),ch);
if (iter != str.end()) {
int n = count(iter,ch);
std::cout << n << " consecutive '" << ch << "' found";
} else {
std::cout << "no char found";
}
std::cout << std::endl;
}
int main()
{
std::string line;
while (std::getline(std::cin,line)) {
search(line,'a');
}
return 0;
}
我得到的错误:
00.cpp: In function 'void search(const string&,char)': 00.cpp:19:31: error: no matching function for call to 'count(__gnu_cxx::__normal_iterator >&,char&)'
我发现如果我在函数 std::string::iterator
中将完整类型 auto
更改为 count
并让编译器推断它会按预期工作的类型(或者至少我认为它作品)。为什么?
解决方法
str
被标记为const
,那么从中取出的迭代器,即iter
的类型是std::string::const_iterator
,不能转换为{{1} }} 隐式传递给 std::string::iterator
。
由于count
不会修改count
指向的元素,所以你可以让iter
也带count
。
const_iterator