Because the base class member is a dependent name - its meaning depends on the template parameter, and so isn't known until the template is instantiated. The name isn't looked up in the generic IBase
template, since that might be specialised to give it a different meaning before instantiation.
Qualifying it with IBase<T>::
calls the base-class function non-virtually; that's generally not what you want, especially if (as here) it's a pure virtual function with no implementation. Hence the linker error when you tried that.
Qualifying it with this->
tells the compiler that it's a member, and any further checking is deferred until the template is instantiated. The function is still called virtually.