Consider this test case: int f() { return 23; } template<typename T> struct Base { int f() { return 13; } }; template<typename T> struct Derived : public Base<T> { int g() { return f(); } }; int main() { Derived<int> value; return value.g(); } Here, Derived::g calls ::f, not Base::f. This is due to a C++ name lookup rule, see: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html http://gcc.gnu.org/wiki/VerboseDiagnostics#dependent_base gdb implements this wrongly -- if you stop in g and try to call f, gdb will try to call Base::f.