Проблема в том, что вы не можете перегрузить статический метод, используя нестатический метод с той же сигнатурой.
Теперь, если вы попробуете:
struct D {
void foo () {}
static void foo () {}
};
Это вызовет ошибку.
Я не совсем уверен, почему в случае using B::foo
он фактически игнорируется без вызова ошибки / предупреждения (по крайней мере, в GCC 4.5.1).