When using templates, A<AI>::f should not be reachable from main() because it is protected. The correct behavior is observed in the template-less version: the compiler detects an encapsulation error.
% cat foo.cpp #if NO_TEMPLATES == 1 class A { protected: int f() { return 42; } }; class B : public A { using A::f; }; int main() { B b; return b.f(); } #else template<int AI> class A { protected: int f() { return AI; } }; template<int BI> class B : public A<BI> { using A<BI>::f; }; int main() { B<24> b; return b.f(); } #endif % g++ -DNO_TEMPLATES=1 -o foo foo.cpp foo.cpp: In function int main(): foo.cpp:2: error: int A::f() is protected foo.cpp:4: error: within this context % g++ -DNO_TEMPLATES=0 -o foo foo.cpp % ./foo ; echo $? 24 -- Summary: using with templates breaks encapsulation Product: gcc Version: 4.3.3 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: sebastien at soja dot org GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44956