C++ 重载抽象 class 中的虚函数,抽象 class 引用参数不起作用

C++ overload virtual function in abstract class with abstract class reference parameter not working

我有一个树结构(抽象class)定义如下

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>&) 有一个抽象的实现 class。

其派生 class,仅实现 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>&) 或任何其他名称,它突然 有效

为什么我不能像这样重载这个函数?无论如何还是我必须更改它的名称?

我寻找其他答案,但它们在不同的 subjects/cases.

编辑:如何在 Derived class 中使用 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 个参数和私有的参数,并抱怨它是私有的。

问题是重载只适用于定义在相同范围内的函数。 ListTree<string> 定义了 insFirst(node, item),但没有定义 insFirst(node, const Tree<T,N>&)。所以对 tree.insFirst(tree.root(), tree2) 的调用是无效的,因为在派生 class 中定义的唯一版本 insFirst 不能用这些参数调用。

正如评论中提到的那样,修复方法是告诉编译器还考虑使用 using 声明从基础 class 开始 insFirst(node, const Tree<T,N>&),或者,如您所见发现,把baseclass里面的insFirst(node, const Tree<T,N>&)改个名字,这样就可以直接调用了