http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46687
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> 2010-11-28 01:57:06 UTC --- C has two copies of the name A::foo, as B1::foo and B2::foo. if C only saw A::foo then it would be unambiguous because the same members would be found, as in this variant: struct A { static int foo(); static int foo(char); }; struct B1 : A { }; struct B2 : A { }; struct C : B1, B2 { }; enum { X = sizeof C::foo() }; However, because you have using declarations in B1 and B2 name lookup finds B1::foo and B2::foo ... at least by my reading, which could be wrong