0

我正在用 C++ 编写二叉树(使用链接节点表示)。我想编写一个成员函数来计算树中的节点数,所以我编写了一个递归函数来完成这项工作:

template<class Item> size_t binary_tree<Item>::count_node(
                                binary_tree_node<Item>* const node)
{
    if(node == NULL) return 0;
    else return 1 + count_node(node->get_left())
                  + count_node(node->get_right());
}

我在 binary_tree 类的私有中设置了这个函数。我有一个公共函数 size() 来调用它:

template<class Item> size_t binary_tree<Item>::size()
{
    return count_node(root);
}

现在我的问题来了:如果我像代码一样编写 size() ,它可以正常工作。但是,如果我像这样将返回值设置为 const:

template<class Item> size_t binary_tree<Item>::size() const
{
    return count_node(root);
}

此代码无法编译。编译器抱怨无法将 size_t 转换为 const size_t。如何解决这个问题?谢谢。

4

1 回答 1

4

在方法内部调用的任何方法都const必须是const它们自己。所以在你的情况下,这个count_node类也需要被标记const

更正式地说,当你进入一个被标记的函数const时,this指针变为 a const T*,因此你不能使用它调用任何不接受 a 的方法const T*,因为你必须将 a强制const T*转换为 a T*,这不是允许。如果你真的想做一些不是 const 的事情,你可以const_cast用来移除 const-ness(不推荐),或者使用 volatile 成员/方法。

于 2013-04-24T01:26:21.863 回答