ошибка в c ++? - set_difference в c ++ не возвращает std :: copy - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть код как показано ниже:

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. Может кто-нибудь, пожалуйста, помогите.

1 Ответ

4 голосов
/ 28 декабря 2011

Если вы написали свою собственную функцию копирования, которую компилятор может видеть в той же области видимости, что и std::copy, и это возможный кандидат, то наверняка это вызовет неоднозначность.

Нет волшебного флага, который вы можете установить, чтобы он использовал std::copy, но я думаю , если вы поместите свою собственную копию в пространство имен и не using это пространство имен, компилятор победит ' не сможет найти его и вернуться к std::copy. Тем не менее, я не думаю, что могу понять случай, когда вы захотите создать альтернативный copy, который работает для итераторов множеств, и если вы написали универсальный, он, вероятно, не должен называться copy, потому что это вызовет нет ошибок неопределенности, подобных этой.

...