Nicol’s solution works fine, but this is an alternative:
template<typename T>
struct Base
{
void print1() {cout << "Base::print1" << endl;};
void print2() {cout << "Base::print2" << endl;};
};
template<>
void Base<int>::print2() {cout << "Base<int>::print2()" << endl;};
That way you can specialize only specific member functions and still use those that you haven’t specialized(in this case, print1) without any problem. So now you’d use it just like you wanted:
Base<int> i;
i.print1();
i.print2(); // calls your specialization
Demo here.