Перегрузка функции-члена среди нескольких базовых классов
По сути, я хочу, чтобы несколько функций-членов с одинаковыми именами, но с разными сигнатурами, распространялись на несколько базовых классов.
Пример:
#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 за участие в этом ответе и в значительной степени за создание этого абзаца.