2011-12-28 3 views
0

나는 코드를 아래와 같이있다 :버그 - C++로 set_difference는 표준을 반환하지 않습니다 :: 복사

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 
} 

내가 얻는 컴파일 오류가 문제가 return copy(first1,last1,result);

같은 set_difference 반환 overloading ambiguity std::copy(.... 입니다

set_difference의 알고리즘에 대해서는 here을 확인하십시오.

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'를 사용해야합니다. [this code] (http://codepad.org/KZZ8nBDL)를 컴파일 할 수 있습니까? 다른 네임 스페이스에서 자신의 '복사본'을 옮길 수 있습니까? – vstm

+0

형식은 C++에서 중요합니다. 당신이 말하는 대상의 절반은 유형을 모릅니다. –

답변

4

컴파일러가 std::copy과 동일한 범위에서 볼 수있는 복사 기능을 작성 했으므로 가능한 후보 인 경우 모호성이 발생할 수 있습니다.

이 당신이 std::copy를 사용하도록 설정할 수 있습니다 마법 플래그가 없습니다,하지만 당신은 네임 스페이스에 자신의 복사본을 넣어한다면 나는 생각 하지 using 네임 스페이스, 컴파일러가 찾을 수 없다는 점과 std::copy으로 다시 이동하십시오. 즉, 반복자 세트에 대해 작동하는 대체 copy을 만들려는 경우를 이해할 수 있다고 생각하지 않습니다. 일반적인 끝점을 작성한 경우 끝이라고 할 수 없기 때문에 복사라고해서는 안됩니다. 이처럼 모호한 오류가 발생했습니다.