C++ Error: Conversion to Non-Scalar Type [closed]

谁都会走 提交于 2020-03-18 17:28:27

问题


I seem to be having a peculiar error in the following code segment (ignore the excess header files and the blank main function, I just wanted to isolate this problem into a compileable .cpp file for posting here). It says error conversion from '[some type I defined]' to non-scalar type '[some type I defined]'.

The code in this particular example is supposed to take a set of list of strings as one input parameter (named input), and a reference to a list of strings as another (named output) and calculate the longest common prefix list of strings from among the lists in input and store the result into output.

The compiler error message (also included as a comment in the corresponding line is this:

lcp.cpp:28:47: error: conversion 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

And here is the actual program:

#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;
}

I would love to hear from the experts here as to why and when this sort of error happens and what the work-around could be.


回答1:


Since C++11, std::set has no non-constant iterator. When you say this:

(*it).begin();

you're dereferencing a constant iterator to get a constant object and calling begin() on that object, which gives you another constant iterator since the object is constant. You then try to store this constant iterator into a non-constant iterator, hence the error.



来源:https://stackoverflow.com/questions/13273714/c-error-conversion-to-non-scalar-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!