如果函数有重载,Boost phoenix 成员函数运算符将无法编译

让你真实

我想对具有重载的类函数使用 Boost phoenix 成员函数运算符,例如here

以下示例失败:

#include <boost/phoenix/phoenix.hpp>
#include <boost/phoenix/operator.hpp>

using namespace std;
using namespace boost::phoenix::placeholders;

struct A
{
    int m_id = 1;
    int func() const { return 1; }
    void func(int id) { m_id = id; }
};

int main()
{
    A *a = new A;
    auto retVal = (arg1->*&A::func)()(a);

    return 0;
}

有错误:

    In function 'int main()': 17:21: error: no match for 'operator->*'
(operand types are 'const type {aka const
boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::
tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> 
>}' and '<unresolved overloaded function type>') 17:21: note: candidate is: In
 file included from /usr/include/boost/phoenix/operator/arithmetic.hpp:13:0,
 from /usr/include/boost/phoenix/operator.hpp:13, from /usr/include/boost
/phoenix/phoenix.hpp:13, from 1: /usr/include/boost/proto/operators.hpp:295:9:
 note: template<class Left, class Right> const typename 
boost::proto::detail::enable_binary<boost::proto::domainns_::deduce_domain, 
boost::proto::detail::not_a_grammar, 
boost::mpl::or_<boost::proto::is_extension<Arg>, 
boost::proto::is_extension<Right> >, boost::proto::tagns_::tag::mem_ptr, const
 Left&, const Right&>::type boost::proto::exprns_::operator->*(Left&&, 
Right&&) BOOST_PROTO_DEFINE_OPERATORS(is_extension, deduce_domain) ^ 
/usr/include/boost/proto/operators.hpp:295:9: note: template argument 
deduction/substitution failed: 17:28: note: couldn't deduce template parameter 
'Right'

但是,如果我注释掉该行void func(int id) { m_id = id; },它会按预期工作。

我怎么知道要使用哪个重载?

卢布格

处理(成员)函数指针重载集合总是很痛苦。您需要将地址强制转换为具有所需重载确切签名的指针。在您的情况下,选择int A::func()

auto retVal = (arg1->*static_cast<int (A::*)() const>(&A::func))()(a);

或者更具可读性,但基本相同:

const auto memFctPtr = static_cast<int (A::*)() const>(&A::func);
auto retVal = (arg1->*memFctPtr)()(a);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

成员函数与运算符重载

来自分类Dev

运算符重载:从成员函数调用朋友函数

来自分类Dev

Boost phoenix可变参数函数解析

来自分类Dev

运算符重载和非成员函数C ++

来自分类Dev

运算符重载-内联非成员函数

来自分类Dev

如何将+和+ =运算符重载为非成员函数?

来自分类Dev

运算符重载函数

来自分类Dev

Boost Phoenix编译错误

来自分类Dev

Boost Phoenix编译错误

来自分类Dev

错误 C2244 无法将函数定义与 cpp /// 运算符重载中的现有声明相匹配

来自分类Dev

没有。*或-> *运算符的调用成员函数的方法

来自分类Dev

地址运算符,带有指向成员函数的指针

来自分类Dev

可以将重载运算符重构为非成员函数会破坏任何代码吗?

来自分类Dev

自由函数运算符==()或成员函数运算符==()中哪个优先?

来自分类Dev

模板化运算符重载解决方案,成员与非成员函数

来自分类Dev

指向重载const成员函数和成员运算符的歧义指针

来自分类Dev

将算术运算符视为函数

来自分类Dev

Java 8-三元运算符返回函数无法编译

来自分类Dev

函数的C ++运算符重载

来自分类Dev

运算符<<在构造函数中的重载

来自分类Dev

运算符重载和函数重载产生不明确的编译器错误

来自分类Dev

Haskell中的全局&&运算符重载无法编译

来自分类Dev

如何通过流插入运算符调用成员函数?

来自分类Dev

STL-赋值运算符与`assign`成员函数

来自分类Dev

模板化类朋友运算符成员函数

来自分类Dev

STL-赋值运算符与`assign`成员函数

来自分类Dev

尝试使用*指针运算符调用类成员函数

来自分类Dev

删除函数签名类型的成员身份?(lambda 的运算符())

来自分类Dev

如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

Related 相关文章

  1. 1

    成员函数与运算符重载

  2. 2

    运算符重载:从成员函数调用朋友函数

  3. 3

    Boost phoenix可变参数函数解析

  4. 4

    运算符重载和非成员函数C ++

  5. 5

    运算符重载-内联非成员函数

  6. 6

    如何将+和+ =运算符重载为非成员函数?

  7. 7

    运算符重载函数

  8. 8

    Boost Phoenix编译错误

  9. 9

    Boost Phoenix编译错误

  10. 10

    错误 C2244 无法将函数定义与 cpp /// 运算符重载中的现有声明相匹配

  11. 11

    没有。*或-> *运算符的调用成员函数的方法

  12. 12

    地址运算符,带有指向成员函数的指针

  13. 13

    可以将重载运算符重构为非成员函数会破坏任何代码吗?

  14. 14

    自由函数运算符==()或成员函数运算符==()中哪个优先?

  15. 15

    模板化运算符重载解决方案,成员与非成员函数

  16. 16

    指向重载const成员函数和成员运算符的歧义指针

  17. 17

    将算术运算符视为函数

  18. 18

    Java 8-三元运算符返回函数无法编译

  19. 19

    函数的C ++运算符重载

  20. 20

    运算符<<在构造函数中的重载

  21. 21

    运算符重载和函数重载产生不明确的编译器错误

  22. 22

    Haskell中的全局&&运算符重载无法编译

  23. 23

    如何通过流插入运算符调用成员函数?

  24. 24

    STL-赋值运算符与`assign`成员函数

  25. 25

    模板化类朋友运算符成员函数

  26. 26

    STL-赋值运算符与`assign`成员函数

  27. 27

    尝试使用*指针运算符调用类成员函数

  28. 28

    删除函数签名类型的成员身份?(lambda 的运算符())

  29. 29

    如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

热门标签

归档