2012-02-07 2 views
1

C++ STL에서 men_fun와 bind1st에 오래 된 문제 :이 코드를 지금몇 가지 간단한 코드는 문제를 설명 할 것이다

class Foo {}; 
struct Bar { 
    bool foo(const Foo &f) const { return false; } 
}; 

int main() { 
    Bar bar; 

    vector<Foo> v; 

    std::find_if(v.begin(), v.end(), std::bind1st(
     std::mem_fun_ref(&Bar::foo), bar)); 

    return 0; 
} 

는 VS2010의 C++ 컴파일러는 불평 할 것이다 : 오류 C2535를 : 부울 표준 : binder1st < _Fn2> :: 연산자() (const를 푸 &) CONST : 이미 이전 버전의 Visual Studio에 선언

의 정의 멤버 함수 문제를 참조하기 위해 참조하는 관련이 두 개 더 컴파일 오류가있을 것입니다. VS2010에서는 이러한 문제가 발생했지만 C2535는 여전히 남아 있습니다.

이 질문은 this one과 유사합니다. 해당 게시물에 의해 제안 된 것처럼, 나는 std :: bind 또는 boost 라이브러리를 대안으로 사용할 수있다. 그들은 잘 작동하지만, 지금은,이 경우에 이전 bind1st 스타일을 사용하는 것이 가능한지 알고 싶습니다 또는 STL 기능 프레임 워크에 내재 된 결함이 문제가 더 무엇입니까? 감사합니다.

답변

3

이것은 VS 또는 모든 컴파일러의 문제가 아닙니다. mem_fun_ref이 반환하는 형식은 단항 함수에서 상속되는 mem_fun_ref_t입니다. 이 펑터는 멤버 함수가 속한 클래스 유형이어야하는 하나의 인수를 취합니다. mem_fun_ref은 인수를 사용하는 멤버 함수에는 작동하지 않습니다.

바인더는 이유 때문에 더 이상 사용되지 않습니다.

+0

나는 이것이 사실이 아니라고 생각합니다. 'mem_fun_ref'는 하나의 인수를 취하는 멤버 함수에 과부하가 있습니다. 반환 유형은 binary_function의 하위 유형 인'const_mem_fun1_ref_t <_Result, _Ty, _Arg>'입니다. VS2010의 경우 헤더 파일에 정의되어 있습니다. weidi

+0

@weidi'[deprecated.member.pointer.adaptors]'의 D8.2.2에서'const_mem_fun_ref_t'의 정의를 찾을 수 있습니다. MSVC 확장 프로그램을보고있을 것입니다. MSDN (머리글조차도 포함되지 않음)에서 해당 설명서를 찾을 수 없습니다. – pmr

+0

MSDN 설명서는 [this] (http://msdn.microsoft.com/en-us/library/etctxx69(v=vs.100).aspx)입니까? 미안해, 내가 잘못 이해했다면. 난 정말 다양한 C++ 문서에 대해 많이 몰라서 나는 D8.2.2가 무엇을 가리키는 지 전혀 모른다. 어댑터의 비추천이 언급되는 링크를 공유 할 수 있습니까? – weidi

0

Using bind1st for a method that takes argument by reference을 참조하십시오. 귀하의 사례와 비슷한 경우 인 것으로 보입니다.

+0

아니요. 여전히 효과가 없을 것입니다. 내 대답을 읽으십시오. 덕분에 – pmr

+0

. 그 게시물은 C++ 11이나 boost로 바꾸는 것 이외의 해결책을 제공하지 않는다. bind1st의 디자인에 본질적으로 잘못된 것이 있을지 모른다는 나의 견해를지지하는 듯하다. – weidi

관련 문제