>

부스트 라이브러리 테스트 프레임 워크를 사용하여 단위 테스트를 만들었으며 해당 라이브러리와 함께 std :: bind 플레이스 홀더를 사용하는 데 문제가 발생했습니다.

std::placeholders:: 를 명시 적으로 사용하면  + _1, 잘 작동합니다 :

std::bind(&TestFixture::concatStrings, this, std::placeholders::_1, std::placeholders::_2)

하지만 std::placeholders:: 를 생략하면  직접 _1 를 사용하십시오 컴파일 오류가 발생합니다 :

Error   1   error C2664: 'std::string std::_Pmf_wrap<std::string (__thiscall TestFixture::* )(const std::string &,const std::string &),std::string,TestFixture,const std::string &,const std::string &>::operator ()(_Farg0 &,const std::string &,const std::string &) const' : cannot convert argument 2 from 'boost::arg<1>' to 'const std::string &' C:\APPS\msvs2013\VC\include\functional  1149    1   test

람다를 사용하는 것이 제가 생각할 수있는 최고의 솔루션입니다 :

[&](const std::string& x, const std::string& y){ return concatStrings(x, y); }

std :: bind와 같은 부스트 ​​라이브러리와 std로 정의 된 메소드를 사용하는지 이해하고 싶습니다. 미리 감사드립니다.

  • 답변 # 1

    와이즈 비즈

    따라서 올바르게 사용하면 문서화 된대로 작동합니다.

    와이즈 비즈

    잘못 사용하면 작동하지 않습니다.

    와이즈 비즈

    예, 명명 충돌이 있습니다. 충돌 자체는 없지만 불행히도 Boost Bind는 역사적으로 자리 표시자를 전역 네임 스페이스에 넣습니다.

    부스트 바인드

    If I explicitly use std::placeholders:: + _1, it works fine:

    를 사용하는 것이 가능합니다 , 부스트 피닉스, 부스트 스피릿

    But if I omit the std::placeholders:: and directly use _1, it results to a compilation error:

     그리고

    I just want to understand if using methods defined in std conflicts with boost library, such as the std::bind.

     하지만 자리 표시 자 자격을 갖추어야 할 수도 있습니다. 또는 고유 한 별칭을 사용하십시오.

    <시간>

    PS. 이 경우 ::_1 를 사용할 수 있어야합니다. . 람다를 사용하는 경우 _ boost::spirit::qi::_1 를 사용하지 않는 것이 좋습니다  안전하지 않은 습관이므로 귀하의 경우에는 std::bind 만 캡처하면됩니다.  또는 원한다면 std::mem_fn .

    [&]

  • 이전 bigcommerce - 스텐실 cli - 설치 오류 :스텐실 초기화 :명령어를 찾을수 없음
  • 다음 r - 조건부로 rbind ()