【问题标题】:C++ is it possible to use a class variable as a default argumentC ++是否可以使用类变量作为默认参数
【发布时间】:2020-04-15 09:33:40
【问题描述】:

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

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

【问题讨论】:

  • 包装器有什么不雅点? int get_height() { return get_height(root); } int get_height(node *head) { ... }

标签: c++ language-lawyer default-arguments


【解决方案1】:

不幸的是,这是不可能的。 Non-static class members 不能用作默认参数。

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

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

一个非静态成员不应出现在默认参数中,除非它 显示为类成员访问表达式的id-expression ([expr.ref]) 或除非它用于形成指向成员的指针 ([expr.unary.op])。 [例子:X​::​mem1() 的声明在 以下示例格式错误,因为没有为 非静态成员 X​::​a 用作初始化器。

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。类、对象和 成员在[class] 中描述。 — 结束示例 ]

正如你所说,你可以添加一个重载的包装函数,比如

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2016-07-03
    • 2011-08-16
    • 2019-11-10
    • 2020-11-27
    • 2011-06-05
    相关资源
    最近更新 更多