2012-03-14 5 views
0

를 호출 http://ideone.com/mGfUj바인딩 및 통과 주위 템플릿 기능이 작동하지 않습니다

중 하나가 작동하지 않습니다 : http://ideone.com/mUL5Y

을 나타냈다 나는 그것이 유형을 공제와 약간의 도움이! 나는 왜 그런지 이해하지 못한다.

어떻게해야합니까?

part2(std::bind(&Quux::part3<Callable>, this, 3, c)) 

그것은 아니다 :

+0

코드를 게시물에 복사 할 수 없습니까? 우리는 24 줄 코드에 대한 오프 사이트 소스를 보게하고 있습니까? –

+0

@NicolBolas 예. 당신은 오류를 얻었고, 그것을 복제 할 수 있으며, 주변에있는 플레이어와 조금씩 ... irc : //chat.freenode.net/##c++에서 적절한 네티켓으로 여겨졌습니다. – Nick

답변

1

문제는 std::bind 내부적으로 Callable의 당신이 여기 두 번째 시간을 통과 할 때 객체 c (가 실제로 std::bind<> 유형의)을 평가 결과를 전달하고 있는지 것 같다 당신이 가정하고있는 것처럼 평가되지 않은 버전의 std::bind 객체를 전달합니다. 당신의 f 함수는 void 형식을 반환 이후

는 따라서 c 식의 결과는 내부적 않은 평가 호출 함수 객체를 void 형태로 전달하고 있지 않습니다. 당신이 턴 Quux::part3의 전화 c을 평가하기 위해 시도하는, Quux::part2Callable 객체 c를 호출하려고 따라서 때 통과 유형이 실제로 void 타입이기 때문에, Quux::part3 두 번째 인수로 호출 개체를 전달할 수 없습니다 호출 가능 유형이 아닙니다.

참조하면, 여기 참조 : http://en.cppreference.com/w/cpp/utility/functional/bind

주 특히 그 :

std::is_bind_expression<T>::value==true 경우 (즉, 다른 std::bind() 표현식은 bind에 초기 호출의 인수로 사용 하였다), 그 바인드 -subexpression이 즉시 호출되고 해당 결과이 함수에 전달됩니다.

당신은 당신이 원하는 때 발생하고, 당신이 std::bind 하위 표현을 통과 할 때, 당신은 람다, 또는 std::function<>와 같은 다른 방법을 찾아해야합니다하지 않도록 평가를 지연하려면 객체, 펑터 (functor), 또는 나중에 호출 할 수 있고 나중에 평가할 수있는 상태를 저장할 수있는 다른 클래스 객체 유형.

+0

어떻게 평가할 수 있습니까? c는 어디에서도 호출되지 않습니다 ... 왜 void()에서 void로 바뀌나요? – Nick

+1

'std :: bind'를 또 다른'std :: bind'에 넘겨 주면 첫 번째 하위 표현식이 평가되고 * results *가 두 번째'std :: bind'에 전달됩니다. 'void (*) (int)'를 평가하면, 호출 가능한'void (*) (int) '가 아닌'void' 타입으로 끝날 것입니다. 명시 적으로'c'를 호출하지는 않지만 호출 된 객체의 결과가 아닌 호출 된 결과와 함께 중첩 된'std :: bind' 표현식 때문에 실제로 배후에서 호출됩니다. – Jason

+0

BTW, 클래스 메서드가 아닌 일반적인 독립형 함수를 사용하는 경우이 변환이 이루어지는 위치와 방법을 더 잘 이해할 것으로 생각됩니다.[다음은 관련 오류 메시지의 예입니다.] (http : //ideone.com/CCQot) – Jason