Код: Выделить всё
b.cpp:44:50: error: no matching function for call to ‘B::A(int, int)’
build] /cpp/b.h:56:10: note: candidate: ‘virtual void B::A()’
[build] 56 | void A();
[build] | ^~~~~~
[build] /cpp/B.h:56:10: note: candidate expects 0 arguments, 2 provided
< /code>
Вот упрощенный код: < /p>
struct A {
int a;
int b;
A(int a=0, int b=0): a(a), b(b) {}
}
class SuperB {
A some_var;
SuperB(A a): some_var(a) {}
};
class B: SuperB {
B(): SuperB(A(1,3)) {}
void A() {
do something
}
}
Я пытался изменить: < /p>
Код: Выделить всё
B(): SuperB(A(1,3)) {}to:
Код: Выделить всё
B(): SuperB(1) {}Это, по крайней мере, составлено, так как компилятор удалось найти конструктор struct a . Мой вопрос: почему? Почему компилятор не выясняет это? Я получаю этот void a () получает приоритет, но это явно не очень хороший кандидат. Почему он не перемещается вниз по списку? P> Обратите внимание, что это отличается от 3.4.1 Unkalied Lookup имени, где функция внутри пространства имен имеет приоритет. Эквивалентная функция здесь (
Код: Выделить всё
void B::AЭто также тонко отличается от не виртуальной функции в базовом классе с тем же именем, но различная подпись не найдена. Там компилятор перестает искать функцию в суперклассе, когда функция в подклассе соответствует имени, даже если подпись не работает.
здесь компилятор игнорирует действительную подпись снаружи Когда неверная подпись в классе имеет одинаковое имя. Имя, оно всегда будет скрывать другую, внешнюю функцию (или конструктор) с тем же именем.
То, что я ожидал>
Подробнее здесь: https://stackoverflow.com/questions/793 ... e-function
Мобильная версия