奇怪的类模板定义解决方案

奇怪的类模板定义
查看了C++primer,类模板定义的通式为:

template <class T1, class T2,..., class Tn>
class TestClass{
//....
};

可是最近看代码,竟然看到如下的类模板定义,是在搞不懂这是什么语法,也不知道该如何理解。话不多说,直接上代码:

namespace _HASH_NAMESPACE {
    template<class T> struct hash
    {
        size_t operator()(const T &p) { return hash_compare<T>()(p); }
    };

    template<class T1, class T2> struct hash_compare<std::pair<T1, T2> >
    {
        static const size_t bucket_size = 4;
        static const size_t min_buckets = 8;
        size_t operator()(const std::pair<T1, T2> &p) const { return hash_compare<T1>()(p.first) + 37 * hash_compare<T2>()(p.second); }
        bool operator()(const std::pair<T1, T2> &p1, const std::pair<T1, T2> &p2) const { return p1 < p2; }
    };
    
    template<class T> struct hash_compare<T *>
    {
        static const size_t bucket_size = 4;
        static const size_t min_buckets = 8;
        size_t operator()(T *p) const { return (size_t)p; }
        bool operator()(T *p1, T *p2) const { return p1 < p2; }
    };
}


疑问:
1. hash_compare是否为类模板?
2. hash_compare<std::pair<T1, T2> >后面的“<std::pair<T1, T2> >”有何作用?
先谢了。

补充说明:
这个代码是Visual Studio 2005的工程。
------解决思路----------------------
1. 是类模板

2. 
请搜索 偏特化 (partial specialization)

另,可参考
http://en.cppreference.com/w/cpp/language/partial_specialization
------解决思路----------------------
要深入理解泛型编程先看《STL源码剖析》