繁体   English   中英

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

[英]Why am I getting no matching function call error?

我试图调用一个指向成员函数的指针,但不知道为什么它不起作用。 错误如下:

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::*)()]' '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]'实例中'decltype ((declval<A>)().*(declval<B>)()()) foo(A&&, B&&) [with A = A; B = int (A::*)(); decltype ((declval<A>)().*(declval<B>)()()) = int]' 'decltype ((declval<A>)().*(declval<B>)()()) foo(A&&, B&&) [with A = A; B = int (A::*)(); decltype ((declval<A>)().*(declval<B>)()()) = int]' '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)) (...)', eg '(... ->* 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]' 'decltype ((declval<A>)().*(declval<B>)()()) foo(A&&, B&&) [with A = A; B = int (A::*)(); decltype ((declval<A>)().*(declval<B>)()()) = int]' '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]

我在做什么错,我该如何解决?

比您编写的代码要简单一些。 而且您忘记了调用函数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM