From the journal

"An instantiated object of a templated class is called a specialization; the term specialization is useful to remember because it reminds us that the original class is a generic class, whereas a specific instantiation of a class is specialized for a single datatype (although it is possible to template multiple types)."

An instantiated object of a templated class has no special name. The process of the compiler making a class for a given template parameter is called template instantiation, much like object instantiation is when an object is made from a class, template instantiation is when a class is created by the compiler for a given template parameter.

Template specialization is when a template is made different than the general case. There are many uses for this, but they are generally fairly complex.

Code:
#include <iostream>
#include <typeinfo>
#include <string>

using namespace std;

template <class T> 
void func(const T& arg) {
    std::cout << "General template for type " << typeid(arg).name() <<" " <<  arg << std::endl;
}

template <> 
void func<int>(const int& arg) {
    std::cout << "Specialized template for type int " << arg << endl;
}

int main(int argc, char *argv[])
{
    func('a');
    func(true);    
    func(212.3f);
    func(21L);
    func(3.131459265);
    func(20);
    func("asdf");
    func(string("asdf"));
  return 0;
}