用C++写一个类时,想用类中的成员函数作为另一个成员函数的函数指针的默认形参,但是编译器报错::默认参数类型不能转换
不知道哪里出错了
void verticalOrder(void(*visit)(BinTreeNode<T>*)=&Visit) ;
void Visit(BinTreeNode<T>* subTree) {};
这两个函数都是类中的成员函数,哪里出错了
用C++写一个类时,想用类中的成员函数作为另一个成员函数的函数指针的默认形参,但是编译器报错::默认参数类型不能转换
不知道哪里出错了
void verticalOrder(void(*visit)(BinTreeNode<T>*)=&Visit) ;
void Visit(BinTreeNode<T>* subTree) {};
这两个函数都是类中的成员函数,哪里出错了
关注【以下回答由 GPT 生成】
问题分析:
根据提供的代码,可以看出你想将Visit成员函数作为verticalOrder函数的默认参数。然而,编译器报告了一个类型无法转换的错误。这个错误的原因是,在C++中,成员函数(包括静态成员函数)不能直接转换为函数指针,因为成员函数有一个隐藏的this指针。如果你想使用成员函数作为函数指针,你需要使用到函数指针和this指针的组合。
解决方案:
你可以通过以下两种方式来解决这个问题:
std::function和std::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) {};
};
你可以使用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) {};
};
使用以上两种方法之一,你应该能够在类的成员函数中使用成员函数指针作为默认参数。
注意:以上代码只是给出了修正方案的示例,并未考虑完整的类定义和实现。实际使用时,你可能需要根据你的具体情况做适当的修改和调整。
【相关推荐】