2014-11-17 3 views
0

VS2008에서 VS2013으로 코드를 이식하려고하는데 std :: bind에서 오류가 발생합니다. 오류 C2668 오류 : '바인딩': 오버로드 된 함수에 대한 모호한 호출을 말합니다. 여기에 일부 코드입니다 :이 코드는 비주얼 스튜디오 2008에서 일VS2008에서 VS2003으로 이식 할 때 C2668 오류가 발생했습니다.

// Relevant prototypes: 
class CLineaPlanta:public SomeBase { /*...*/ }; 
int SomeBase::TipoLinea()const; 
void SomeBase::TipoLinea(int val); 

// function paramater: const std::shared_ptr<CLineaPlanta>& lineasBuscar 
// function parameter: int tipoLinea; 

std::shared_ptr<CLineaPlanta> lineas; 
std::remove_copy_if(lineasBuscar.begin(), lineasBuscar.end(), 
std::back_inserter(lineas), 
     bind(std::not_equal_to<int>(), bind(&CLineaPlanta::TipoLinea, _1), tipoLinea)); 

하지만) (컴파일러의이 TipoLinea의 버전을 알아내는 힘든 시간을 보내고, 2013 년

물론 Visual Studio에서 언급 된 오류를 제공 전화하려고 해요. getter 버전을 getTipoLinea로 바꾸면 오류가 사라집니다.

관련성이있는 경우 SomeBase는 추상적이지 않으며 CObject (이유는 모르겠 음) 및 코드의이 부분과 관련이없는 인터페이스에서 파생됩니다.

누구나 VS2008에이 문제가 없으며이를 방지하는 방법을 설명 할 수 있습니까? (물론 함수의 이름을 바꾸는 것 이외의 다른 방법)?

+1

당신과 함께 다시 작성 빠르고 쉽게 찾을 수 있습니다 람다 함수. –

+0

물론입니다. 그리고 나는 그것을 끝낼 것이라고 생각합니다. 그러나 나는 그것을 다시 쓰기 시작하기 전에 그것을 "일하기"를 원한다. 그리고 다른 비슷한 오류가 있습니다. – MikMik

답변

1

이 코드가 VS2008에서 왜 작동했는지 나는 알지 못합니다. 2008 년 bind이 매크로 기반 variadics 에뮬레이션으로 구현 된 결과 일 수 있습니다. bind에 전달되는 인수의 개수에 따라 여러 오버로드가 있었는데 그 중 하나는 첫 번째 인수가 동일한 수의 인수를 갖는 멤버 함수에 대한 포인터가 될 것으로 예상했습니다 . 이렇게하면 컴파일러가 하나의 바운드 인수를 bind에 전달하므로 함수 인수에 하나의 매개 변수가 있어야한다는 것을 알 수 있으므로 컴파일러는이를 명확하게 할 수 있습니다.

VS2013에서 true variadics가 사용되었지만 첫 번째 인수의 유형이 더 일반적이고 컴파일러가 더 이상 모호하지 못하다는 것을 의미합니다. 이 컴파일하려면, 당신은 명시 적으로 멤버 포인터를 캐스팅해야합니다

std::remove_copy_if(lineasBuscar.begin(), lineasBuscar.end(), 
    std::back_inserter(lineas), 
    bind(std::not_equal_to<int>(), 
     bind(static_cast<int (SomeBase::*)() const>(&CLineaPlanta::TipoLinea), 
       _1), 
      tipoLinea)); 

을하지만 닐 커크가 말했듯이, 람다로 재 작성하는 것은 쉽다 :

std::remove_copy_if(lineasBuscar.begin(), lineasBuscar.end(), 
    std::back_inserter(lineas), 
    [tipoLinea](const std::shared_ptr<CLineaPlanta>& linea) { 
     return linea->TipoLinea() != tipoLinea; 
    }); 
+0

감사합니다. 나는 그것을 시도 할 것입니다. 그리고 나는 그 동안 copy_if (something)로 remove_copy_if (not_something)을 변경할 것이다. – MikMik