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){…}