1
template <typename Key,typename Value>
void add(SBTNode<Key,Value>*& t, const SBTNode<Key,Value>* x)
{
    if (t==SBTNode<Key,Value>::getPNIL()) { t = x; return;}
    if (x->key<t->key) add(t->left,x);
    else if (t->key<x->key) add(t->right,x);
    else { t->value+=x->value; return; }
    maintain(t, t->key<x->key);
}

template <typename Key,typename Value>
class SBTree
{
private:
    SBTNode<Key,Value>* root;
public:
    SBTree():root(SBTNode<Key,Value>::getPNIL()) {}
    void add(Key& key,Value& value) {  add(root,new SBTNode<Key,Value>(key,value));}
};

在这里,void add(Key& key,Value& value) { add(root,new SBTNode<Key,Value>(key,value));} };我想调用第一个add函数,但是,编译器似乎认为唯一的候选函数是void add(Key& key,Value& value).

 error: no matching function for call to 'SBTree<row_col, int>::add(SBTNode<row_col, int>*&, SBTNode<row_col, int>*)'
  void add(Key& key,Value& value) {  add(root,new SBTNode<Key,Value>(key,value));}
                                     ^~~
note: candidate: 'void SBTree<Key, Value>::add(Key&, Value&) [with Key = row_col; Value = int]'
  void add(Key& key,Value& value) {  add(root,new SBTNode<Key,Value>(key,value));}

我试图替换为add<Key,Value>(root,new SBTNode<Key,Value>(key,value));,编译器只是告诉我 <,> 是错误的。

error: expected primary-expression before ',' token
  void add(Key& key,Value& value) {  add<Key,Value>(root,new SBTNode<Key,Value>(key,value));}
                                            ^
error: expected primary-expression before '>' token
  void add(Key& key,Value& value) {  add<Key,Value>(root,new SBTNode<Key,Value>(key,value));}

当我给这两个函数起不同的名字时,一切都是对的,在这种情况下函数重载有什么问题?

4

1 回答 1

1

要调用成员函数隐藏的全局 add 函数,请在函数调用前加上 ::(全局范围运算符)

template <typename Key,typename Value>
class SBTree
{
//...
    void add(Key& key,Value& value) { 
       ::add(root,new SBTNode<Key,Value>(key,value));
    }
};
于 2021-03-07T00:31:47.450 回答