Решение:
void baz() { ::foo(1); }
"Почему возникает какой-то конфликт имен, хотя сигнатуры методов разные?"
Потому что C ++ всегда, всегда, сначала ищет имена. Когда он находит имя в соответствующей области, он затем проверяет, какие подписи доступны для этого имени в этой области. Таким образом, функция-член foo()
скрывает свободную функцию foo(int)
везде, где она находится в области видимости (то есть в других функциях-членах класса).
Следующий код не будет компилироваться по той же причине:
struct A {
virtual void foo(int) = 0;
// attempt to provide a useful helper
virtual void foo() { foo(23); }
};
struct B : public A {
void foo(int i) {
std::cout << i << "\n";
}
};
int main() {
B b;
b.foo(); // oops, can't find foo(), because class B hid it
A &a = b;
a.foo(); // that works. So much for Liskov's substitution principle.
}
B, как написано, сломан, потому что он удаляет функциональность из своего базового класса (хотя только когда упоминается как B, а не когда упоминается как A). litb предоставляет ссылку в комментарии ниже, объясняющую, как ее разорвать.