小胡不糊涂123 2023-11-16 19:03 采纳率: 95.2%
浏览 10
已结题

C++成员函数指针问题

用C++写一个类时,想用类中的成员函数作为另一个成员函数的函数指针的默认形参,但是编译器报错::默认参数类型不能转换
不知道哪里出错了

void verticalOrder(void(*visit)(BinTreeNode<T>*)=&Visit) ;

void Visit(BinTreeNode<T>* subTree) {};

这两个函数都是类中的成员函数,哪里出错了

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-17 04:38
    关注

    【以下回答由 GPT 生成】

    问题分析:

    根据提供的代码,可以看出你想将Visit成员函数作为verticalOrder函数的默认参数。然而,编译器报告了一个类型无法转换的错误。这个错误的原因是,在C++中,成员函数(包括静态成员函数)不能直接转换为函数指针,因为成员函数有一个隐藏的this指针。如果你想使用成员函数作为函数指针,你需要使用到函数指针和this指针的组合。

    解决方案:

    你可以通过以下两种方式来解决这个问题:

    1. 使用std::functionstd::bind

    std::function是一个通用的函数封装器,可以用于包装任意可调用对象,包括成员函数。std::bind函数可以用来绑定成员函数和对象。

    以下是修正后的代码示例:

    #include <functional>
    
    class BinTreeNode {
    public:
        template<typename T>
        void verticalOrder(std::function<void(BinTreeNode<T>*)> visit = std::bind(&BinTreeNode::Visit, this, std::placeholders::_1));
    
    private:
        template<typename T>
        void Visit(BinTreeNode<T>* subTree) {};
    };
    
    1. 使用Lambda表达式:

    你可以使用Lambda表达式来捕获this指针,然后将Lambda表达式作为函数指针的参数。

    以下是修正后的代码示例:

    class BinTreeNode {
    public:
        template<typename T>
        void verticalOrder(void(*visit)(BinTreeNode<T>*) = [](BinTreeNode<T>* subTree) {});
    
    private:
        template<typename T>
        void Visit(BinTreeNode<T>* subTree) {};
    };
    

    使用以上两种方法之一,你应该能够在类的成员函数中使用成员函数指针作为默认参数。

    注意:以上代码只是给出了修正方案的示例,并未考虑完整的类定义和实现。实际使用时,你可能需要根据你的具体情况做适当的修改和调整。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月18日
  • 已采纳回答 12月10日
  • 创建了问题 11月16日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真