在多个基类之间重载成员函数

Overloading member function among multiple base classes

基本上我想要有多个同名但不同签名的成员函数,分布在多个基类。

示例:

#include <iostream>

struct A
{
    void print(int) { std::cout << "Got an int!" << std::endl; }
};

struct B
{
    void print(double) { std::cout << "Got a double!" << std::endl; }
};

struct C : A, B {};

int main()
{
    C c;
    c.print((int)0);

    return 0;
};

但是我在 clang 上遇到了这个错误:

main.cpp:18:7: error: member 'print' found in multiple base classes of different types
    c.print((int)0);
      ^
main.cpp:5:10: note: member found by ambiguous name lookup
    void print(int) { std::cout << "Got an int!" << std::endl; }
         ^
main.cpp:10:10: note: member found by ambiguous name lookup
    void print(double) { std::cout << "Got a double!" << std::endl; }

为什么会模棱两可?即使参数数量不同,我也会得到相同的错误。

是否有任何解决方法来获得类似的行为?

在派生的 class 中使用 using 声明 - 它会解决您的问题。它使重载可见和都可以参与决议。

struct C : A, B {
    using A::print;
    using B::print;
};

回答一下为什么这个是模棱两可的:其实不是可见性,而是无法参与重载决议,由于未在同一范围内定义。 using 声明将这些方法拉入 C 范围,因此它们都成为有效的重载解析选项。

感谢 @Pete Becker 参与这个回答并几乎创建了这个段落。