0

私は以下のようなコードを持っています:

typedef std::set<std::string> set_of_strings; 
            set_of_strings s1, s2, result1; 
    some_func()
    {
            s1.insert("1-2"); 
            s1.insert("1-1"); 
            s1.insert("3-4"); 
            s2.insert("1-2"); 
            s2.insert("1-3"); 
            s2.insert("3-4"); 

            set_of_strings::iterator s1_begin = s1.begin(); 
            set_of_strings::iterator s1_end = s1.end(); 
            set_of_strings::iterator s2_begin = s2.begin(); 
            set_of_strings::iterator s2_end = s2.end(); 
            set_of_strings::iterator result_begin = result1.begin();
            td::insert_iterator<set_of_strings> result_inserter = std::inserter(result1, result_begin); 

            set_difference(s1_begin, s1_end,s2_begin, s2_end,result_inserter); //This is the problem line
}

私が得るコンパイルエラーはoverloading ambiguity std::copy(.... 、問題は次のset_differenceように返される ことですreturn copy(first1,last1,result);

set_differenceのアルゴリズムはこちらをご確認ください。

set_difference は次のように返します。

copy(..)

であればstd::copy何の問題もありません。

以下のようにブロック内にステートメントを入れてみました:

{
using namespace std;
set_difference(s1_begin, s1_end,s2_begin, s2_end,result_inserter);
}

しかし、これは機能しません。問題は、私たちが独自の目的のために作成したコピー機能にあり、多くの場所で使用されていることを知っています.ここで私は使用したいstd::copy. 誰でも助けてくれませんか。

4

1 に答える 1

4

コンパイラが同じスコープで見ることができる独自のコピー関数を作成しstd::copy、それが可能な候補である場合、それはあいまいさを引き起こすことを確認してください。

を使用するように設定できる魔法のフラグはありませstd::copy、独自のコピーを名前空間に配置し、usingその名前空間を使用しないと、コンパイラーはそれを見つけられず、にフォールバックできなくなると思いますstd::copy。そうは言っても、セットイテレータに対して機能する代替を作成したい場合を理解できるとは思いません。copy一般的なものを作成した場合、それはおそらくコピーと呼ばれるべきではありません。このようなあいまいなエラー。

于 2011-12-28T06:21:03.753 に答える