我试图调用一个指向成员函数的指针,但不知道它为什么不能工作。以下是错误:
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:警告:控件到达非无效函数的末尾- reaches type
我做错了什么,我该如何解决呢?
发布于 2013-05-05 15:22:45
比你编码的要简单一些。你忘了调用你的函数:
template <typename A, typename B>
auto foo(A&& a, B&& b) -> decltype((a.*b)())
{
return ((std::forward<A>(a)).*(std::forward<B>(b)))();
}https://stackoverflow.com/questions/16385931
复制相似问题