Перегрузка функции-члена среди нескольких базовых классов

По сути, я хочу, чтобы несколько функций-членов с одинаковыми именами, но с разными сигнатурами, распространялись на несколько базовых классов.

Пример:

#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; }

Почему это неоднозначно? Даже с разным количеством аргументов я получаю одинаковую ошибку.

Есть ли обходной путь, чтобы получить подобное поведение?

1 ответ

Решение

Использовать using объявление в производном классе - это исправит ваши проблемы. Это делает обе перегрузки видимый и принять участие в решении.

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

Чтобы ответить, почему это неоднозначно: на самом деле речь идет не о видимости, а о невозможности участвовать в разрешении перегрузки, поскольку он не определен в той же области. using Директива тянет эти методы в C область действия, так что они оба становятся допустимыми параметрами разрешения перегрузки.

Спасибо @Pete Becker за участие в этом ответе и в значительной степени за создание этого абзаца.

Другие вопросы по тегам