我有一个像这样定义的树结构(抽象类)
template<class T, class N>
class Tree {
public:
typedef T item;
typedef N node;
virtual node root();
...
virtual void insFirst(node, const Tree<T,N>&);
virtual node insFirst(node, item) = 0;
...
private:
virtual void insFirst(node, const Tree<T, N>&, node, bool);
}
你可以猜到,insFirst(node, const Tree<T,N>&)
在抽象类中有一个实现。
它的派生类只实现insFirst(node, item)
。
当我致电insFirst
时:
ListTree<string> tree;
ListTree<string> tree2;
... // initialization
tree.insFirst(tree.root(), tree2); // CALL
我收到编译错误
No viable conversion from 'ListTree<string>' (aka 'ListTree<basic_string<char, char_traits<char>, allocator<char> > >') to 'item' (aka 'std::__1::basic_string<char>')
这是因为它指的是insFirst(node, item)
而不是另一个。
但如果我以insFirst(node, const Tree<T,N>&)
或任何其他名称重命名insFirstSubtree(node, const Tree<T,N>&)
,则突然正常。
为什么我不能像这样重载这个功能?无论如何还是我必须更改它的名字?
我寻找其他答案,但他们是在不同的科目/案例。
编辑:如何在Derived类中使用using Tree<T,ListNode<T>>::insFirst;
和2个不同的insFirst? (insFirst(node, const Tree<T,N>&)
和insFirst(node, const Tree<T,N>&, node, bool)
。C ++(Xcode)默认选择具有4个参数且私有的并且抱怨它是私有的。
答案 0 :(得分:1)
问题是重载仅适用于在同一范围内定义的函数。 ListTree<string>
定义insFirst(node, item)
,但未定义insFirst(node, const Tree<T,N>&)
。因此,对tree.insFirst(tree.root(), tree2)
的调用无效,因为在派生类中定义的insFirst
的唯一版本无法使用这些参数调用。
正如评论中所提到的,修复是告诉编译器还要使用insFirst(node, const Tree<T,N>&)
声明从基类中考虑using
,或者,如您所发现的,更改名称基类中的insFirst(node, const Tree<T,N>&)
,以便可以直接调用它。