我似乎在以下代码段中遇到了一个特殊的错误(忽略多余的头文件和空白的 main 函数,我只是想将此问题隔离到可编译的 .cpp 文件中以便在此处发布)。它表示从“[我定义的某些类型]”到非标量类型“[我定义的某些类型]”的错误转换。
这个特定示例中的代码应该将一组字符串列表作为一个输入参数(命名为输入),并将对字符串列表的引用作为另一个(命名为输出),并计算其中的最长公共前缀列表。输入中的列表并将结果存储到输出中。
编译器错误消息(也作为注释包含在相应行中)是这样的:
lcp.cpp:28:47:错误:从‘转换std::list<std::basic_string<char> >::const_iterator {aka std::_List_const_iterator<std::basic_string<char> >}
' 到非标量类型 'std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}
’要求
这是实际的程序:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <list>
using namespace std;
void getLongestCommonPrefix(set <list <string> > & input, list <string> & output)
{
set <list <string> > :: iterator it = input.begin();
output = *it;
for(; it != input.end(); ++it)
{
if(output.size() > (*it).size())
{
list <string> :: iterator it1 = output.begin();
advance(it1, (*it).size()-1);
output.erase(it1, output.end());
}
list <string> :: iterator it1 = output.begin();
list <string> :: iterator it2 = (*it).begin(); //lcp.cpp:28:47: error: conv ersion from ‘std::list<std::basic_string<char> >::const_iterator {aka std::_List_const_iterator<std::basic_string<char> >}’ to non-scalar type ‘std::list<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}’ requested
for(; it1 != output.end(); ++it1,++it2)
{
if(*it1 != *it2)
break;
}
output.erase(it1, output.end());
if(!output.size())
return;
}
}
int main()
{
return 0;
}
我很想听听专家的意见,了解为什么会发生这种错误,何时发生,以及解决方法是什么。
从 C++11 开始,std::set
没有非常量迭代器。当你这样说时:
(*it).begin();
您正在取消引用常量迭代器以获取常量对象并调用begin()
在该对象上,这会为您提供另一个常量迭代器,因为该对象是常量。然后,您尝试将此常量迭代器存储到非常量迭代器中,因此会出现错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)