【问题标题】:C++ Error: Conversion to Non-Scalar Type [closed]C++ 错误:转换为非标量类型 [关闭]
【发布时间】:2012-10-27 17:52:29
【问题描述】:

我似乎在下面的代码段中遇到了一个特殊的错误(忽略多余的头文件和空白的 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;
}

我很想听听这里的专家关于为什么和何时发生这种错误以及解决方法可能是什么。

【问题讨论】:

  • 它在错误消息中说....begin() 给你一个const_iterator,而你正试图将它用作iterator

标签: c++ string stl iterator syntax-error


【解决方案1】:

自 C++11 起,std::set 没有非常量迭代器。当你这样说时:

(*it).begin();

您正在取消引用一个常量迭代器以获取一个常量对象并在该对象上调用begin(),这会为您提供另一个常量迭代器,因为该对象是常量。然后您尝试将此常量迭代器存储到非常量迭代器中,因此会出现错误。

【讨论】:

  • 感谢您的解释。在这种特定情况下,解决方法是什么?
猜你喜欢
  • 2015-12-01
  • 2013-07-02
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多