请考虑以下设置:

我得到一个界面

template<class T>
  void FooClass<T>::foo(boost::function<double (int)> f)
{...}

我想使用Functor实现f:
class MyFun {
    public: double operator()(int a) {do something...;}
}

但是,接口(interface)中定义了另一个功能
template<class T>
  template <class FunPtr>
    void FooClass<T>::foo(const FunPtr& f)
{...}

调用FooClass对象时,
MyFun f;
FooClass<double> fooclass;
fooclass.foo(f);

它使用第二个定义,而我希望它叫第一个-可以以某种方式更改吗?

最佳答案

编译器“首选”第二个定义,因为模板版本会导致与函数对象参数的完全匹配,而boost::function参数需要一个隐式转换才能被接受(并且隐式转换在直接重载解析后才考虑)。您可以通过构造一个boost::function对象,然后然后将该对象传递给函数来实现所需的功能(请注意,您可以在同一行中进行此操作,为清楚起见,我将其单独进行):

boost::function<double (int)> bMyFun(myFunInstance);
fooClassInstance.foo(bMyFun);

关于c++ - C++编译器如何确定调用哪个函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7105380/

10-13 05:53