C++ C++;是否可以使用类变量作为默认参数

C++ C++;是否可以使用类变量作为默认参数,c++,language-lawyer,default-arguments,C++,Language Lawyer,Default Arguments,我有一个树类,如下所示: class avl { node *root; public: avl(int data){ root->data = data; } int get_height(node *head = root){ //error here if (head->right == head->left) return 0; int l = get_height(head->lef

我有一个树类,如下所示:

class avl
{
   node *root;
public:
    avl(int data){
      root->data = data;
    }

    int get_height(node *head = root){  //error here

        if (head->right == head->left) return 0;
        int l = get_height(head->left);
        int r = get_height(head->right);

        if (l > r) return l+1;
        return r+1;
     }
}

毫不奇怪,这会在
get\u height
定义中生成错误。g++抱怨它是“非静态数据成员的无效使用”。我可以修改这个问题吗?或者我应该在这里使用不雅观的包装。如果您能为标准中关于此错误原因的说明添加一些细节,我将不胜感激

不幸的是,这是不可能的。不能用作默认参数

默认参数中不允许使用非静态类成员(即使 它们不会被计算),除非用于形成指向成员的指针 或在成员访问表达式中

int b;
class X {
  int a;
  int mem1(int i = a); // error: non-static member cannot be used
  int mem2(int i = b); // OK: lookup finds X::b, the static member
  static int b;
};
从标准上看,

非静态成员不得出现在默认参数中,除非 显示为类成员访问表达式的 ()或除非用于形成指向成员的指针 (). [示例:
X的声明]​::​中的mem1()
以下示例的格式不正确,因为没有为 非静态成员
X​::​用作初始值设定项的

int b;
class X {
  int a;
  int mem1(int i = a);              // error: non-static member a used as default argument
  int mem2(int i = b);              // OK;  use X​::​b
  static int b;
};
X的声明​::​然而,mem2()
是有意义的,因为没有对象 需要访问
静态
成员X​::​b
。类、对象和 成员如所述。-结束示例]

正如您所说,您可以添加一个重载包装器函数,如

int get_height(node *head) {
    ...
}
int get_height() {
    return get_height(this->root);
}

包装纸有什么不雅之处
int get_height(){return get_height(root);}int get_height(node*head){…}