5

次のコード セグメントで奇妙なエラーが発生しているようです (余分なヘッダー ファイルと空の main 関数は無視してください。ここに投稿するために、この問題をコンパイル可能な .cpp ファイルに分離したかっただけです)。「[私が定義した型]」から非スカラー型「[私が定義した型]」へのエラー変換を示しています。

この特定の例のコードは、文字列のリストのセットを 1 つの入力パラメーター (入力という名前) として受け取り、文字列のリストへの参照を別のパラメーター (出力という名前) として受け取り、その中から文字列の最も長い共通プレフィックス リストを計算することになっています。リストを入力し、結果を出力に格納します。

コンパイラ エラー メッセージ (対応する行にコメントとして含まれているのは次のとおりです。

lcp.cpp:28:47: エラー: '<code>std::list<std::basic_string<char> >::const_iterator {aka std::_List_const_iterator<std::basic_string<char> >}' からの変換非スカラー型 '<code>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;
}

この種のエラーが発生する理由と時期、および回避策について、ここの専門家から聞きたいです。

4

1 に答える 1

7

C++11 以降、std::set非定数反復子はありません。あなたがこれを言うとき:

(*it).begin();

定数イテレータを逆参照して定数オブジェクトを取得し、そのオブジェクトを呼び出すとbegin()、オブジェクトが定数であるため、別の定数イテレータが得られます。次に、この定数反復子を非定数反復子に格納しようとすると、エラーが発生します。

于 2012-11-07T16:20:08.173 に答える