5

VC10 で VC6 プロジェクトをコンパイルしようとしています... set_intersection でエラー C2678 が表示されます: 理解するためにいくつかの例を書きました。このスニペットをコンパイルする方法を説明できる人はいますか?

#include <vector>
#include <algorithm>
#include <iostream>
#include <set>
#include <string>

int main( )
{
    using namespace std;

    typedef set<string> MyType;

    MyType in1, in2, out;
    MyType::iterator out_iter(out.begin()); 

    set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), out_iter);
}

出力 :

c:\program files\microsoft visual\studio 10.0\vc\include\algorithm(4494): エラー C2678: '=' バイナリ: タイプ 'const std::basic_string<_Elem の左側のオペランドを取る演算子が定義されていません。 _Traits,_Ax>' (または受け入れ可能な変換がない)

std::vector代わりにa を使用するとstd::set、コンパイルは成功しました。許容できる)

4

1 に答える 1

7

試す set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), inserter(out, out.begin()) );

これは、set_intersection が出力反復子に書き込みたいため、出力コンテナーのサイズが大きくなるためです。ただし、これはイテレータだけでは実行できません (既存の要素を上書きするために使用できますが、サイズが大きくなることはありません)。

編集:タイプミスを修正しました。セットに追加するにはインサーターを使用します。back_inserter は、ベクターなどに対してのみ機能します。

編集 2: 別のタイプミスを修正しました。STLinserterには、可能性のある挿入位置へのヒント イテレータである 2 番目の引数が必要です。ありがとうチェプセスカフ。

于 2010-06-30T15:29:06.860 に答える