>>27
やはり無理でした。
VC++.NETのMSDNのDeepC++ やテンプレートをいろいろ調べたところ。
次のようにするとスマートに解決できました。

enum TypeM
{
type_default = 0,
type_cstring = 1,
type_cwnd = 2
};

template<typename T,enum TypeM type=type_default> class Test :public T
{
public:
friend bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2);
};

template<> class Test<CString>
{
public:
//friendの特殊化は無理みたい。>コンパイルできるが呼べない。
};

template<> class Test<CWnd>
{
public:
//friendの特殊化は無理みたい。>コンパイルできるが呼べない。
};

template <typename T,enum TypeM type> bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2)
{
//typeは定数なので最適化時にswitchステートメントからは1つの関数が得られる。
//これがtemplateの最も優れた性質なのです。(MSDN参照)
switch(type)
{
case(type_cstring):
AfxMessageBox("CString");
break;
case(type_cwnd):
AfxMessageBox("CWnd");
break;
default:
AfxMessageBox("Default");
break;
}
return true;
}