C++ 컴파일러는 이러한 함수 중 어떤 것이 호출되는지 어떻게 결정합니까?
인터페이스
template<class T>
void FooClass<T>::foo(boost::function<double (int)> f)
{...}
펑터를 사용하여 f를 구현하고 싶습니다.
class MyFun {
public: double operator()(int a) {do something...;}
}
그러나 인터페이스
에 정의 된 다른 함수가 있습니다.template<class T>
template <class FunPtr>
void FooClass<T>::foo(const FunPtr& f)
{...}
FooClass 객체가 호출되면
MyFun f;
FooClass<double> fooclass;
fooclass.foo(f);
두 번째 정의를 사용합니다. 첫 번째 정의를 호출하고 싶습니다. 어떻게 든 변경할 수 있습니까?
답변 해 주셔서 감사합니다. 나는이 개념에 익숙하지 않은데, 지금은이 구체적인 예에서 어떻게 작동하는지 궁금합니다. – Hans
* 잠재 암시 적 변환 체인은 과부하가 선택 될 때까지 고려되지 않습니다. * ??? 그것들은 고려되며, 이것이 최고의 과부하가 발견되는 방법입니다. 문제는 템플릿 버전이 변환이 필요한 것보다 더 적합하지만 과부하 해결은 두 가지 모두를 고려한 다음 템플릿을 결정할 것이라는 점입니다. –
@David : 템플릿이 더 적합합니다. 왜냐하면 변환이 먼저 고려되면 함수가 boost :: function으로 변환 될 수 있다고 생각 될 것이고 첫 번째 오버로드가 더 나은 일치 일 것입니다. 그렇지 않습니까? –