我有一个头文件,如下所示
#ifndef BINARY_SEARCH_TREE_H
#define BINARY_SEARCH_TREE_H
struct Node
{
int data;
Node *left, *right;
Node(int data);
};
class BinarySearchTree
{
Node *head;
public:
BinarySearchTree();
void insert(int data);
void inorder(Node *cur = head);
};
#endif
并且它说
In file included from Binary_Search_Tree.cpp:2:0:
Binary_Search_Tree.h:17:28: error: invalid use of non-static data member ‘BinarySearchTree::head’
void inorder(Node *cur = head);
^
Binary_Search_Tree.h:13:9: note: declared here
Node *head;
注意:我在定义方法时没有提供默认值。我想这没有必要。
默认值只允许使用静态值或常量值吗?如果是,那么为什么? 或者别的什么不对?
答案 0 :(得分:2)
您正在寻找的行为无法在C ++中完成。默认值必须“有些不变”。这意味着一个实际的常量,或一个静态字段等。有关允许的内容的更多信息here,而不是默认参数。
解决此问题的一种方法是在没有任何参数的情况下进行重载,这些参数只调用从head
开始的单参数函数。
另一种方法是使用null作为默认参数,并在提供时将其替换为head。但是,如果到达空叶节点,这可能会中断。
答案 1 :(得分:2)
标准(草案)的引用:
非静态成员不应出现在默认参数中,除非它显示为类成员访问表达式([expr.ref])的id表达式,或者除非它用于形成指向成员的指针([expr] .unary.op])
注意:在定义方法时,我没有提供默认值。我想这不是必要的。
甚至不允许在重新声明中重新定义默认参数(以前声明的函数的定义是)。
默认值只允许使用静态值或常量值吗?
没有。也允许非常数值。但是有很多例外,成员也包含在例外中。
您可以通过使用重载来解决限制。