0

我成功地将 Set 模板实现为 AVL 平衡二叉搜索树。现在我正在尝试使代码更短且更具可读性。当将 fix_imbalance_left 和 fix_imbalance_right 合并到使用 left_or_right 模板化的 fix_imbalance 中时,我遇到了问题。我一步一步重新开始,现在我在 fix_imbalance(left_or_right,node) 并收到以下错误:

adts/implementations/set.cpp:224:3: error: no matching function for call to ‘Set<int>::rotate(Set<int>::nodeT*&)’
adts/implementations/set.cpp:224:3: note: candidate is:
adts/implementations/set.cpp:70:39: note: template<Set<int>::directionT DIRECTION> void Set::rotate(Set<ElemT>::nodeT*&) [with Set<ElemT>::directionT DIRECTION = L, ElemT = int]

请注意,rotate(node) 模板已实现并合并(左+右到模板中),并且在使用单独的 fix_imbalance 之前成功。我已经尝试过:'this->' 并在单独的 <> 中的 fucntionname 之后指定两个模板参数,但这些都没有帮助。

你能指出我做错了什么吗?

更多代码:

enum directionT { LEFT=0, RIGHT=1 }; // inside class definition

template <directionT DIRECTION> void rotate(nodeT * & t); // line 70, inside class def

template <typename ElemT>
bool Set<ElemT>::fix_imbalance(directionT direction, nodeT * & node)
{
    directionT R = (direction==LEFT) ? RIGHT : LEFT;
    ...
    rotate<R>(node); // line 224
    ...
}

// this below worked before,
// when fix_imbalance_left and fix_imbalance_right were separate
// there I called rotate<LEFT>(node); and rotate<RIGHT>(node); and it worked
template <typename ElemT>
template <typename Set<ElemT>::directionT L>
void Set<ElemT>::rotate(nodeT * & t)
{ ... }

对不起,我没有早点发布这个。

4

1 回答 1

0

我认为您正在尝试从变量实例化模板。请尝试:

template <typename ElemT>
bool Set<ElemT>::fix_imbalance(directionT direction, nodeT * & node)
{
    directionT R = (direction==LEFT) ? RIGHT : LEFT;
    ...
    if (R==LEFT)
         rotate<LEFT>(node); // line 224
    else
         rotate<RIGHT>(node);
    ...
}
于 2012-08-28T10:39:17.093 回答