为什么我没有匹配函数调用错误?

时间:2013-05-05 15:12:56

标签: c++

我正在尝试调用指向成员函数的指针而不知道它为什么不起作用。以下是错误:

  

prog.cpp:在函数‘int main()’中:
  prog.cpp:16:19:错误:没有匹配函数来调用‘foo(A, int (A::*)())’
  prog.cpp:16:19:注意:候选人是:
  prog.cpp:4:6:注意:template<class A, class B> decltype ((declval<A>)().*(declval<B>)()) foo(A&&, B&&)
  prog.cpp:4:6:注意:模板参数扣除/替换失败:
  prog.cpp:代替‘template<class A, class B> decltype ((declval<A>)().*(declval<B>)()) foo(A&&, B&&) [with A = A; B = int (A::*)()]’
  prog.cpp:16:19:从这里要求
  prog.cpp:4:6:错误:无效使用非静态成员函数

#include <utility>

template <typename A, typename B>
auto foo(A&& a, B&& b) -> decltype(std::declval<A>().*(std::declval<B>()))
{
    return (std::forward<A>(a)).*(std::forward<B>(b));
}

struct A
{
    int f() { return 0; }
};

int main()
{
    foo(A(), &A::f);
}

更新

我更改了代码以回应评论/答案,这就是我所拥有的:

template <typename A, typename B>
auto foo(A&& a, B&& b) -> decltype((std::declval<A>().*(std::declval<B>()))())
{
    return (std::forward<A>(a)).*(std::forward<B>(b))();
}

但是当我打电话给它时,这就是它的回归:

  

prog.cpp:实例化‘decltype ((declval<A>)().*(declval<B>)()()) foo(A&&, B&&) [with A = A; B = int (A::*)(); decltype ((declval<A>)().*(declval<B>)()()) = int]’
  prog.cpp:16:19:从这里要求
  prog.cpp:6:55:错误:必须使用‘.*’‘->*’‘std::forward<int (A::*)()>((* & b)) (...)’, e.g. ‘(... ->* std::forward<int (A::*)()>((* & b))) (...)’中调用指向成员的功能   prog.cpp:在函数‘decltype ((declval<A>)().*(declval<B>)()()) foo(A&&, B&&) [with A = A; B = int (A::*)(); decltype ((declval<A>)().*(declval<B>)()()) = int]’中:
  prog.cpp:7:1:警告:控制到达非空函数的末尾[-Wreturn-type]

我做错了什么,如何解决?

1 个答案:

答案 0 :(得分:1)

它比你编码的要简单一些。你忘了打电话你的功能:

template <typename A, typename B>
auto foo(A&& a, B&& b) -> decltype((a.*b)())
{
    return ((std::forward<A>(a)).*(std::forward<B>(b)))();
}