2011-12-28 2 views
0

У меня есть код, как показано ниже:ошибка в C++ - set_difference в C++ не возвращает зЬй :: копировать

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);

Пожалуйста, проверьте here для алгоритма 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

[Он компилируется отлично] (http://ideone.com/AatQz). Поэтому проблема заключается в коде, который вы не показывали. Что такое 'set_of_strings',' s1', 's2',' result1' и 'td ::'? Что такое * полные сообщения об ошибках? – ybungalobill

+0

Ну, 'set_difference' определяется в пространстве имен' std', и он также должен использовать 'std :: copy'. Можете ли вы скомпилировать [этот код] (http://codepad.org/KZZ8nBDL) - что он показывает? Можете ли вы переместить свою собственную «копию» в другое пространство имен? – vstm

+0

Типы важны в C++. Половина объектов, о которых вы говорите, мы не знаем типов. –

ответ

4

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^