下头例子中c++类的模板特化与成员函数的特化//有什么区别

下面例子中c++类的模板特化与成员函数的特化//有什么区别?


#include<iostream>
#include<cstring>
#include<typeinfo>
using namespace std;
template<class T>class D
{
public:
  D(T x,T y):m_x(x),m_y(y){}
  int compare(void)
  {
    cout<<"Type of m_x is "<<typeid(m_x).name()<<endl;
    cout<<"Type of m_y is "<<typeid(m_y).name()<<endl;
    if(m_x<m_y)
return -1;
    if(m_x>m_y)
return 1;
    return 0;
  }
private:
  T m_x;
  T m_y;
};
//类的模板特化
/*template<>class D<char*>
{
public:
  D(char*x,char*y):m_x(x),m_y(y){}
  int compare(void)
  {
    cout<<"***Type of m_x is***"<<typeid(m_x).name()<<endl;
    cout<<"****Type of m_y is***"<<typeid(m_y).name()<<endl;
    if(strcmp(m_x,m_y)>0)
return 1;
    if(strcmp(m_x,m_y)<0)
return -1;
    return 0;
  }
private:
  char* m_x;
  char* m_y;
};*/
//成员函数的特化
template<>
int D<char*>::compare(void)
{
    cout<<"***Type of m_x is***"<<typeid(m_x).name()<<endl;
    cout<<"****Type of m_y is***"<<typeid(m_y).name()<<endl;
    if(strcmp(m_x,m_y)>0)
return 1;
    if(strcmp(m_x,m_y)<0)
return -1;
    return 0;
}
int main(int argc,char*argv[])
{
  D<int>d1(10,20);
  cout<<d1.compare()<<endl;
  
  D<double>d2(0.1,0.2);
  cout<<d2.compare()<<endl;
  
  D<string>d3("good","better");
  cout<<d3.compare()<<endl;

  char sz1[]="courage";
  char sz2[]="excellent";
  D<char*>d4(sz1,sz2);//比较的是两个字符指针
  cout<<d4.compare()<<endl;
  return 0;
}


------解决方案--------------------
int main(int argc,char*argv[])
{
      D<int>d1(10,20);
      cout<<d1.compare()<<endl;
       
      D<double>d2(0.1,0.2);
      cout<<d2.compare()<<endl;
       
      D<string>d3("good","better");
      cout<<d3.compare()<<endl;
 
      char sz1[]="courage";
      char sz2[]="excellent";
      D<char*>d4(sz1,sz2);//比较的是两个字符指针
      cout<<d4.compare()<<endl;
      return 0;
}