【问题标题】:Why am I getting no matching function call error?为什么我没有收到匹配的函数调用错误?
【发布时间】:2013-05-05 23:27:40
【问题描述】:

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

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);
}

更新:

我根据 cmets/answers 更改了代码,这就是我所拥有的:

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

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

【问题讨论】:

  • declval 函数不带任何参数。
  • return() 之间的表达式周围缺少括号;你应该写return ((std::forward&lt;A&gt;(a)).*(std::forward&lt;B&gt;(b))) ();

标签: c++


【解决方案1】:

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

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

【讨论】:

  • 应该可以。然而,我的 g++(可能是旧的)给了我sorry, unimplemented: mangling dotstar_expr
  • @JohnB,我用的是gcc 4.7.0,也不是太新。
  • @JohnB,我可以提议this,但我认为这实际上是题外话。
  • 我想这样就可以了。谢谢。
猜你喜欢
  • 2020-11-27
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多