为什么编译器(g++)找不到第一个 add 函数?
Why compiler(g++) cannot find the first add function?
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));}
当我给两个函数取不同的名字时,一切正常,在这种情况下函数重载有什么问题?
要调用成员函数隐藏的全局add函数,在函数调用前加上::(全局作用域运算符)
template <typename Key,typename Value>
class SBTree
{
//...
void add(Key& key,Value& value) {
::add(root,new SBTNode<Key,Value>(key,value));
}
};
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));}
当我给两个函数取不同的名字时,一切正常,在这种情况下函数重载有什么问题?
要调用成员函数隐藏的全局add函数,在函数调用前加上::(全局作用域运算符)
template <typename Key,typename Value>
class SBTree
{
//...
void add(Key& key,Value& value) {
::add(root,new SBTNode<Key,Value>(key,value));
}
};