1

我正在尝试将第二个可选参数传递给我的搜索功能:

class ExponentialTree
{
public:
node* Search(int num, node* curr_node=root);
void Insert(int num);

private:
node* root;
};

node* ExponentialTree::Search(int num, node* curr_node)
{

如果我用一个参数调用,我希望它设置为 root。我在声明中尝试了默认参数,在实现中尝试了默认参数,两者(我知道它不是真的),两个声明。没有任何效果。有任何想法吗?我不想重载方法,因为它是唯一会改变的行。

谢谢。

4

3 回答 3

1

非静态成员变量不能用作默认参数。

以下是中的相关部分C++ standard draft (N3225), section § 8.3.6, point 9:

.. a non-static member shall not be used in a default argument expression, even if it
is not evaluated, unless it appears as the id-expression of a class member access expression (5.2.5) or unless
it is used to form a pointer to member (5.3.1). [ Example: the declaration of X::mem1() in the following
example is ill-formed because no object is supplied for the non-static member X::a used as an initializer.
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;
};

root在这里是一个非静态成员变量——因此你不能将它指定为默认参数。

于 2013-11-06T12:05:13.577 回答
1

利用:

    node* Search(int num, node* curr_node=NULL);

并处理函数体中 NULL 指针的情况:

    node* Search(int num, node* curr_node)
    {
         if (curr_node == NULL){
               //...
         }
         //...
    }

或者它也可以在实现部分设置,但只使用 NULL。

于 2013-11-06T11:38:25.697 回答
1

这是一个典型的例子,说明你实际上可以从使用重载中获益:

node* Search(int num, node* curr_node) 
{
   // Your implementation
}

接着

inline node* Search(int num) { return Search(num, root); }

您在此明确声明,当没有给出参数时,您应该将root其用作 的值curr_node

无需进行运行时测试,代码可以在编译时确定,并且您不必编写NULL真正的意思root

于 2013-11-07T04:20:14.890 回答