错误消息:无法将参数1从“节点*”转换为“节点”

时间:2010-06-20 14:14:48

标签: visual-c++ pointers

我正在写一个表达式树。

Node类的实例是left,right和parent成员。

感谢James McNellis中的this post,我宣称它们是指针。

   class Node
   {
     public:
        char *cargo; 
        int depth; 
        Node *parent;
        Node *left; 
        Node *right;
    //constructors/destructor:
        Node(void); 
        Node(int a_depth, Node *pparent = __nullptr); 
        ~Node();
    //method:
        void traverse_tree(Node n)
    };

现在我尝试遍历树并将其打印出来(发送到“out”)。

递归调用'traverse_tree(left);'和'traverse_tree(右);'

导致错误消息“无法将参数1从'Node *'转换为'Node'”。

最初调用Traverse_tree,并将根节点作为争论。

我认为参数“(Node n)”的声明让编译器感到困惑,而且它不知道

是否要调用构造函数。

如何将“left”和“right”传递给“traverse_tree”方法?

void Node::traverse_tree(Node n)
    //utility to view the tree
{
    if (((left) ==  __nullptr)||((right) ==  __nullptr))
    {
        return;
    }
    traverse_tree(right);
    out<<'  '<<n.cargo<<"\n";
    traverse_tree(left);
    return;
};

2 个答案:

答案 0 :(得分:3)

取消引用你的指针:

traverse_tree(*right);

您可能还想更改traverse_tree方法以接受参考:

void traverse_tree(Node &n)

答案 1 :(得分:2)

我认为您应该使用节点指针调用traverse_tree,而不是节点。您通常使用指针进行此类操作。这将导致类似:

void Node::traverse_tree (Node *n) {
    if ((left == __nullptr) || (right == __nullptr))
        return;
    traverse_tree (right);
    out << "  " << n.cargo << "\n";
    traverse_tree (left);
    return;
};

你可以用:

来称呼它
root.traverse_tree (&root);

您可能希望在某些时候重新设计代码以使其更像C ++ - 如:

void Node::traverse_tree(void) {
    if ((left == __nullptr) || (right == __nullptr))
        return;
    right->traverse_tree();
    out << "  " << cargo << "\n";
    left->traverse_tree();
    return;
};

换句话说,遍历使用子节点本身的方法而不是传递指针(这实际上是“老派”非面向对象的处理方式)。