繁体   English   中英

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

[英]C++ is it possible to use a class variable as a default argument

我有一棵树的 class 如下所示:

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_height定义处产生错误。 g++ 抱怨它是“非静态数据成员的无效使用”。 我可以修改这个问题还是应该在这里使用不优雅的包装器。 如果您能在标准中关于此错误原因的说明中添加一些详细信息,我将不胜感激。

不幸的是,这是不可能的。非静态 class 成员不能用作默认 arguments。

非静态 class 成员在默认值 arguments 中是不允许的(即使它们未被评估),除非用于形成指向成员的指针或在成员访问表达式中。

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

根据标准, [dcl.fct.default]/9

非静态成员不得出现在默认参数中,除非它作为 class 成员访问表达式 ( [expr.ref] ) 的id 表达式出现,或者除非它用于形成指向成员的指针 ( [expr.unary.操作] )。 [示例:以下示例中X::mem1()的声明格式错误,因为没有为用作初始值设定项的非静态成员X::a提供 object。

 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()的声明是有意义的,因为访问static member X::b不需要 object。 类、对象和成员在[class]中描述。 结束示例]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM