成员属性作为方法的默认值

时间:2017-01-28 10:37:08

标签: c++ c++11 default-value

我有一个头文件,如下所示

#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;

注意:我在定义方法时没有提供默认值。我想这没有必要。

默认值只允许使用静态值或常量值吗?如果是,那么为什么? 或者别的什么不对?

2 个答案:

答案 0 :(得分:2)

您正在寻找的行为无法在C ++中完成。默认值必须“有些不变”。这意味着一个实际的常量,或一个静态字段等。有关允许的内容的更多信息here,而不是默认参数。

解决此问题的一种方法是在没有任何参数的情况下进行重载,这些参数只调用从head开始的单参数函数。 另一种方法是使用null作为默认参数,并在提供时将其替换为head。但是,如果到达空叶节点,这可能会中断。

答案 1 :(得分:2)

标准(草案)的引用:

  

非静态成员不应出现在默认参数中,除非它显示为类成员访问表达式([expr.ref])的id表达式,或者除非它用于形成指向成员的指针([expr] .unary.op])

  

注意:在定义方法时,我没有提供默认值。我想这不是必要的。

甚至不允许在重新声明中重新定义默认参数(以前声明的函数的定义是)。

  

默认值只允许使用静态值或常量值吗?

没有。也允许非常数值。但是有很多例外,成员也包含在例外中。

您可以通过使用重载来解决限制。