锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
template <typename T>
struct TraitsHelper;
template <typename T>
struct TraitsHelper {
static const bool isPointer = false;
enum {IsPointer = false};
bool GetIsPointer()
{
return IsPointer;
}
};
template <typename T>
struct TraitsHelper<T*> {
static const bool isPointer = true;
enum {IsPointer = true};
bool GetIsPointer()
{
return IsPointer;
}
};
//call
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int val = 0;
int* pVal = &val;
TraitsHelper<int> a;
TraitsHelper<int*> b;
bool b1 = a.IsPointer;
bool b2 = b.IsPointer;
bool b3 = a.GetIsPointer();
bool b4 = TraitsHelper<int>::IsPointer;
bool b5 = TraitsHelper<int*>::IsPointer;
return 0;
}
]]>
template <typename T>
class E
{
public:
T val;
int errcode;
E(){}
E(const T& val)
{
val = val;
}
operator T() const
{
return val;
}
operator T*()
{
return &val;
}
E<T> operator=(const T& _val)
{
val = _val;
return *this;
}
public:
int fail() const
{
return errcode;
}
};
E<int> GetResult(bool fail)
{
E<int> obj;
obj.val = 0x1000;
obj.errcode = fail;
return obj;
}
int _tmain(int argc, _TCHAR* argv[])
{
E<int> a;
a.val = 5;
a.errcode = false;
int b = a;
int* c = a;
*c = 7;
const int* d = a;
unsigned int e = a = 8;
E<int> x = GetResult(true);
if (x.fail())
printf("error \r\n");
else
printf("succeed \r\n");
if (a.fail())
printf("error \r\n");
return 0;
}
]]>
#include <map>
#include <cstdio>
#ifdef _WIN32
#include <sys/stat.h>
#else
#endif
template<typename Key,typename Value>
class MapStream
{
public:
std::map<Key,Value> m_mapTable;
typedef typename std::map<Key,Value>::iterator MapStreamIterator;
int GetFileSize(const char* filename)
{
struct stat f_stat;
if (stat(filename, &f_stat) == -1) {
return -1;
}
return f_stat.st_size;
}
bool Load(const char* filename)
{
FILE* fp = fopen(filename,"rb");
if (fp ==NULL)
return false;
int metasize = sizeof(Key) + sizeof(Value);
char buffer[sizeof(Key) + sizeof(Value)];
int readed;
Key* _key;
Value* _value;
m_mapTable.clear();
while (fread(buffer,1,metasize,fp)==metasize)
{
_key = (Key*)buffer;
_value = (Value*)&buffer[sizeof(Key)];
m_mapTable[*_key] = *_value;
}
fclose(fp);
return (GetFileSize(filename) == (m_mapTable.size()*metasize));
}
bool Save(const char* filename)
{
FILE* fp = fopen(filename,"wb");
if (fp ==NULL)
return false;
int metasize = sizeof(Key) + sizeof(Value);
char buffer[sizeof(Key) + sizeof(Value)];
int readed;
Key* _key;
Value* _value;
MapStreamIterator iter = m_mapTable.begin();
while (iter!=m_mapTable.end())
{
fwrite(&iter->first, 1,sizeof(Key),fp);
fwrite(&iter->second,1,sizeof(Value),fp);
iter++;
}
fclose(fp);
int filesize = GetFileSize(filename);
return (GetFileSize(filename) == (m_mapTable.size()*metasize));
}
Value& operator[] (const Key& _key)
{
return m_mapTable[_key];
}
Value* GetValue(const Key& _key)
{
MapStreamIterator iter = m_mapTable.find(_key);
if (iter!=m_mapTable.end())
return &iter->second;
return NULL;
}
void SetValue(const Key& _key,const Value& _value)
{
m_mapTable[_key] = _value;
}
void RemoveKey(const Key& _key)
{
m_mapTable.erase(_key);
}
int Count()
{
return m_mapTable.size();
}
};
]]>
鏈榪戝湪浣跨敤鍦ㄤ嬌鐢ㄦā鏉跨壒鍖?nbsp;鍐欎竴孌電▼搴忔椂鍙戠幇涓涓鎬殑闂錛屾瘮濡傚儚濡備笅浠g爜錛?br />
#include <iostream>
using namespace std;
class CMyClass
{
public:
template <typename T>
struct test
{
T i;
};
template <>
struct test<long>
{
unsigned long i;
};
};
int main(void)
{
CMyClass::test<int> test1;
CMyClass::test<long> test2;
CMyClass::test<char> test3;
cout << "typeid(test1.i) is " << typeid(test1.i).name() << endl;
cout << "typeid(test2.i) is " << typeid(test2.i).name() << endl;
cout << "typeid(test3.i) is " << typeid(test3.i).name() << endl;
return 0;
}
榪欐浠g爜鍦↙inux涓嬬殑GCC 3.4.3涓嬫棤娉曠紪璇戦氳繃錛岀紪璇戞椂鎻愮ず閿欒錛?br />
xxx.cpp:12: error: invalid explicit specialization before '>' token
xxx.cpp:12: error: explicit specialization in non-namespace scope `class CMyClass'
浣嗗湪VC6鍜孷C8涓嬮兘鍙互緙栬瘧閫氳繃銆?br />
鍚庣炕闃呰祫鏂欙紝鍙戠幇鏈変漢鎻愬埌錛孋++鏍囧噯涓瀹氾紝宓屽綾繪ā鏉垮湪綾葷殑瀹氫箟涓笉鍏佽琚樉紺虹壒鍖栧0鏄庯紝鍙厑璁稿亸鐗瑰寲錛?#8220;Explicit template specialization is forbidden for nested classes ”錛?#8220;As partial template specialization is not forbidden ”錛夛紝姣斿錛岃繖鏍峰氨鍙互錛?br />
#include <iostream>
using namespace std;
class CMyClass
{
public:
template <typename T, typename S = void>
struct test
{
T i;
};
template <typename S>
struct test<long, S>
{
unsigned long i;
};
};
int main(void)
{
CMyClass::test<int> test1;
CMyClass::test<long> test2;
CMyClass::test<char> test3;
cout << "typeid(test1.i) is " << typeid(test1.i).name() << endl;
cout << "typeid(test2.i) is " << typeid(test2.i).name() << endl;
cout << "typeid(test3.i) is " << typeid(test3.i).name() << endl;
return 0;
}
鍦ㄤ笂闈㈣繖孌典唬鐮佷嬌鐢ㄤ竴涓棤鐢ㄧ殑妯℃澘鍙傛暟鏉ュ疄鐜頒互鍋忕壒浠f浛鐗瑰寲錛屼粠鑰屽寲瑙d簡榪欎釜闂銆傝嚦浜庝負浠涔圴C涓嬭兘澶熸甯哥紪璇戯紝緗戜笂鐨勮祫鏂欒鏄疺C涓嶇鍚堟爣鍑?nbsp;錛?#8220;MSVC is wrong in this case and g++ correct”錛夛紝涓嶈繃榪欑偣鎴戝皻鏈湪C++鏍囧噯涓壘鍒版槑鏂囦緷鎹?br />
浣嗘槸榪欐牱涓鏉ュ氨鏈変釜闂錛屽亸鐗瑰寲鍦╒C6涓嬫槸鐢˙UG鐨勶紝鏃犳硶姝e父浣跨敤錛屼篃灝辨槸璇村嚭鏉ョ殑浠g爜灝嗘棤娉曞吋瀹筕C6銆傚浜嶸C6榪欐牱钀戒紞鐨勭紪璇戝櫒錛屽吋瀹瑰畠 鏄病鏈夊お澶х殑蹇呰錛屼絾鏄洖澶存兂鎯籌紝闅鵑亾瑕佸湪瀹氫箟宓屽綾繪ā鏉跨殑鐗瑰寲錛屽氨涓嶈浜嗕箞錛熷繀欏諱嬌鐢ㄥ亸鐗瑰寲鏉ヤ唬鏇夸箞錛烠++瀵規鏄浣曡瀹氱殑鍛紵緲婚槄鐩稿叧璧勬枡鍚庯紝鎴戞壘 鍒頒簡絳旀錛嶏紞瑕佹妸鐗瑰寲鐨勪唬鐮佸啓鍦ㄧ被瀹氫箟鐨勫闈紙瑕佸啓鍦╪amespace涓嬶級錛屽絎竴孌典唬鐮佸簲璇ュ啓鎴愯繖鏍鳳細
#include <iostream>
using namespace std;
class CMyClass
{
public:
template <typename T>
struct test
{
int i;
};
};
template <>
struct CMyClass::test<long>
{
long i;
};
int main(void)
{
CMyClass::test<int> test1;
CMyClass::test<long> test2;
CMyClass::test<char> test3;
cout << "typeid(test1.i) is " << typeid(test1.i).name() << endl;
cout << "typeid(test2.i) is " << typeid(test2.i).name() << endl;
cout << "typeid(test3.i) is " << typeid(test3.i).name() << endl;
return 0;
}
榪欐牱淇敼鍚庯紝灝卞彲浠ュ湪GCC涓嬬紪璇戦氳繃浜嗭紝鍚屾椂錛孷C6錛孷C8涔熼兘鑳界紪璇戦氳繃錛?br />
鎬葷粨涓涓嬪惂錛?br />鍦–++涓紝濡傛灉瑕佸宓屽綾繪ā鏉胯繘琛岀壒鍖栵紝鍒欒涔堜嬌鐢ㄥ亸鐗瑰寲鏉ユ浛浠g壒鍖栵紙澧炲姞涓涓棤鐢ㄧ殑妯℃澘鍙傛暟錛夛紝瑕佷箞灝?nbsp;鐗瑰寲浠g爜鏀懼湪綾誨畾涔変箣澶栥?br />
鍚屾牱鐨?闈炴ā鏉垮嚱鏁板叿鏈夋渶楂樼殑浼樺厛鏉?br />
杞嚜:http://jeffreyloo.blog.163.com/blog/static/12176167020106171424608/
]]>
C++涓殑妯℃澘鍒嗕負綾繪ā鏉垮拰鍑芥暟妯℃澘
·妯℃澘鐨勭壒鍖?br />
(1)綾繪ā鏉跨壒鍖?br />鏈夋椂涓轟簡闇瑕?閽堝鐗瑰畾鐨勭被鍨?闇瑕佸妯℃澘榪涜鐗瑰寲,涔熷氨鏄壒孌婂鐞?渚嬪,stack綾繪ā鏉塊拡瀵筨ool綾誨瀷,鍥犱負瀹為檯涓奲ool綾誨瀷鍙渶瑕佷竴涓簩榪涘埗浣嶏紝灝卞彲浠ュ鍏惰繘琛屽瓨鍌?浣跨敤涓涓瓧鎴栬呬竴涓瓧鑺傞兘鏄氮璐瑰瓨鍌ㄧ┖闂寸殑.
template <class T>
class stack {};
template<>
class stack<bool>
{
//…//
};
涓婅堪瀹氫箟涓璽emplate < >鍛婅瘔緙栬瘧鍣ㄨ繖鏄竴涓壒鍖栫殑妯℃澘銆傚茍涓斿湪澹版槑鐗瑰寲妯℃澘涔嬪墠涓瀹氳鏈夐潪鐗瑰寲鐨勫0鏄庯紒騫朵笖涓や釜綾葷殑鍚嶅瓧鏄竴鏍風殑錛?br />
(2)鍑芥暟妯℃澘鐨勭壒鍖?br />鐪嬩笅闈㈢殑渚嬪瓙
int main()
{
int highest = mymax(5,10);
char c = mymax(‘a’, ’z’);
const char* p1 = “hello”;
const char* p2 = “world”;
const char* p = mymax(p1,p2);
return 0;
}
鍓嶉潰涓や釜mymax閮借兘榪斿洖姝g‘鐨勭粨鏋?鑰岀涓変釜鍗翠笉鑳?鍥犱負,姝ゆ椂mymax鐩存帴姣旇緝涓や釜鎸囬拡p1 鍜?nbsp;p2 鑰屼笉鏄叾鎸囧悜鐨勫唴瀹?
閽堝榪欑鎯呭喌,褰搈ymax鍑芥暟鐨勫弬鏁扮被鍨嬩負const char* 鏃?闇瑕佺壒鍖栥?br />template <class T>
T mymax(const T t1, const T t2)
{
return t1 < t2 ? t2 : t1;
}
template <>
const char* mymax(const char* t1,const char* t2)
{
return (strcmp(t1,t2) < 0) ? t2 : t1;
}
鐜板湪mymax(p1,p2)鑳藉榪斿洖姝g‘鐨勭粨鏋滀簡銆?br />
4.妯℃澘鐨勫亸鐗瑰寲
妯℃澘鐨勫亸鐗瑰寲鏄寚闇瑕佹牴鎹ā鏉跨殑鏌愪簺浣嗕笉鏄叏閮ㄧ殑鍙傛暟榪涜鐗瑰寲
(1) 綾繪ā鏉跨殑鍋忕壒鍖?br />渚嬪c++鏍囧噯搴撲腑鐨勭被vector鐨勫畾涔?br />template <class T, class Allocator>
class vector
{
// … //
};
template <class Allocator>
class vector<bool, Allocator>
{
//…//
};
榪欎釜鍋忕壒鍖栫殑渚嬪瓙涓紝涓涓弬鏁拌緇戝畾鍒癰ool綾誨瀷錛岃屽彟涓涓弬鏁頒粛鏈粦瀹氶渶瑕佺敱鐢ㄦ埛鎸囧畾銆?br />
(2) 鍑芥暟妯℃澘鐨勫亸鐗瑰寲
涓ユ牸鐨勬潵璇達紝鍑芥暟妯℃澘騫朵笉鏀寔鍋忕壒鍖栵紝浣嗙敱浜庡彲浠ュ鍑芥暟榪涜閲嶈澆錛屾墍浠ュ彲浠ヨ揪鍒扮被浼間簬綾繪ā鏉垮亸鐗瑰寲鐨勬晥鏋溿?br />template <class T> void f(T); (a)
鏍規嵁閲嶈澆瑙勫垯錛屽錛坅錛夎繘琛岄噸杞?br />template < class T> void f(T*); (b)
濡傛灉灝嗭紙a錛夌О涓哄熀妯℃澘錛岄偅涔堬紙b錛夌О涓哄鍩烘ā鏉匡紙a錛夌殑閲嶈澆錛岃岄潪瀵癸紙a錛夌殑鍋忕壒鍖栥侰++鐨勬爣鍑嗗鍛樹細浠嶅湪瀵逛笅涓涓増鏈腑鏄惁鍏佽鍑芥暟妯℃澘鐨勫亸鐗瑰寲榪涜璁ㄨ銆?br />5.妯℃澘鐗瑰寲鏃剁殑鍖歸厤瑙勫垯
(1) 綾繪ā鏉跨殑鍖歸厤瑙勫垯
鏈浼樺寲鐨勪紭浜庢鐗瑰寲鐨勶紝鍗蟲ā鏉垮弬鏁版渶綺劇‘鍖歸厤鐨勫叿鏈夋渶楂樼殑浼樺厛鏉?br />渚嬪瓙錛?br />template <class T> class vector
{
//…//
}; // (a) 鏅氬瀷
template <class T> class vector<T*>
{
//…//
}; // (b) 瀵規寚閽堢被鍨嬬壒鍖?/span>
template <>
class vector <void*>
{
//…//
}; // (c) 瀵箆oid*榪涜鐗瑰寲
姣忎釜綾誨瀷閮藉彲浠ョ敤浣滄櫘閫氬瀷錛坅錛夌殑鍙傛暟錛屼絾鍙湁鎸囬拡綾誨瀷鎵嶈兘鐢ㄤ綔錛坆錛夌殑鍙傛暟錛岃屽彧鏈塿oid*鎵嶈兘浣滀負(c)鐨勫弬鏁?br />
(2) 鍑芥暟妯℃澘鐨勫尮閰嶈鍒?br />闈炴ā鏉垮嚱鏁板叿鏈夋渶楂樼殑浼樺厛鏉冦傚鏋滀笉瀛樺湪鍖歸厤鐨勯潪妯℃澘鍑芥暟鐨勮瘽錛岄偅涔堟渶鍖歸厤鐨勫拰鏈鐗瑰寲鐨勫嚱鏁板叿鏈夐珮浼樺厛鏉?br />渚嬪瓙錛?br />template <class T> void f(T); // (d)
template <class T> void f(int, T, double); // (e)
template <class T> void f(T*); // (f)
template <> void f<int> (int) ; // (g)
void f(double); // (h)
bool b;
int i;
double d;
f(b); // 浠?nbsp;T = bool 璋冪敤 錛坉錛?/span>
f(i,42,d) // 浠?nbsp;T = int 璋冪敤錛坋錛?/span>
f(&i) ; // 浠?nbsp;T = int* 璋冪敤錛坒錛?/span>
f(d); // 璋冪敤錛坔錛?/span>
]]>
int compare(const T &v1,const T &v2)
{
if(v1 < v2) return -1;
if(v2 < v1) return 1;
return 0;
}
濡傛灉鐢ㄤ袱涓猚onst char* 瀹炲弬璋冪敤榪欎釜妯℃澘瀹氫箟錛屽嚱鏁板皢姣旇緝鎸囬拡鐨勫箋備篃灝辨槸姣旇緝涓や釜鎸囬拡鍦ㄥ唴瀛樹腑鐨勭浉瀵逛綅緗紝鍗村茍娌℃湁璇存槑涓庢寚閽堟墍鎸囨暟緇勭殑鍐呭鏈夊叧鐨勪換浣曚簨鎯呫?br />涓轟簡鑳藉灝哻ompare鍑芥暟鐢ㄤ簬瀛楃涓詫紝蹇呴』鎻愪緵涓涓煡閬撴庢牱姣旇緝C椋庢牸瀛楃涓茬殑鐗規畩瀹氫箟銆傝繖浜涘氨琚О浣滄槸鐗瑰寲鐨勶紝瀹冨妯℃澘鐨勭敤鎴瘋岃█鏄忔槑鐨勩?br />
1. 鍑芥暟妯℃澘鐨勭壒鍖?br />鐗瑰寲褰㈠紡錛?br />- 鍏抽敭瀛梩emplate鍚庨潰鎺ヤ竴瀵圭┖鐨勫皷鎷彿<>;
- 鍐嶆帴妯℃澘鍚嶅拰涓瀵瑰皷鎷彿<>錛屽皷鎷彿涓寚瀹氳繖涓壒鍖栧畾涔夌殑妯℃澘鍙傛暟錛?br />- 鍑芥暟褰㈠弬琛?br />- 鍑芥暟浣?br />template<>
int compare<const char*> (const char* const &v1,const char* const &v2)
{
return strcmp(v1,v2);
}
鐗瑰寲鐨勫0鏄庡繀欏諱笌 瀵瑰簲鐨勬ā鏉跨浉鍖歸厤銆傜被鍨嬪艦鍙傚浐瀹氫負const char*銆?br />鍥犳錛屽嚱鏁板艦鍙傛槸const char* 鐨刢onst寮曠敤銆傚綋璋冪敤compare鍑芥暟鐨勬椂鍊欙紝
浼犵粰瀹冧袱涓瓧絎︽寚閽堬紝緙栬瘧鍣ㄥ皢璋冪敤鐗瑰寲鐗堟湰銆傝屼笉璋冪敤涓婇潰鐨勬硾鍨嬬増鏈?br />const char *cp1 = "world", *cp2 = "hi";
int i1, i2;
compare(cp1, cp2); //璋冪敤鐗瑰寲鍑芥暟妯℃澘
compare(i1, i2); //璋冪敤娉涘瀷鍑芥暟妯℃澘
娉ㄦ剰錛?br />* 鍑芥暟妯℃澘鐗瑰寲鏃秚emplate<>涓嶈兘鐪佺暐錛屽鏋滅己灝戠粨鏋滄槸澹版槑璇ュ嚱鏁扮殑閲嶈澆銆?br />* 蹇呴』鍖呭惈鍑芥暟褰㈠弬鍒楄〃銆傚鏋滃彲浠ヤ粠褰㈠弬鍒楄〃鎺ㄦ柇妯℃澘瀹炲弬錛屽垯涓嶅繀鏄劇ず鎸囧畾妯℃澘瀹炲弬銆?br />* 濡傛灉紼嬪簭鐢卞涓枃浠舵瀯鎴愶紝妯℃澘鐗瑰寲鐨勫0鏄庡繀欏誨湪浣跨敤璇ョ壒鍖栫殑姣忎釜鏂囦歡涓嚭鐜般?br />
2.綾繪ā鏉跨殑鐗瑰寲
褰撲嬌鐢–椋庢牸瀛楃涓叉椂錛孮ueue綾誨叿鏈?nbsp;compare鍑芥暟鐩鎬技鐨勯棶棰樸傞棶棰樺氨澶勫湪push鍑芥暟涓紝璇ュ嚱鏁板鍒剁粰瀹氱殑鍊間互鍒涘緩Queue涓殑鏂板厓绱犮傞粯璁ゆ儏鍐典笅錛屽鍒禖椋庢牸瀛楃涓插彧浼氬鍒舵寚閽堬紝涓嶄細澶嶅埗瀛楃銆傝屾樉鐒跺鍒舵寚閽堝皢鍑虹幇涓緋誨垪鐨勪弗閲嶉棶棰樸備負浜嗚В鍐沖鍒禖椋庢牸瀛楃涓茬殑闂錛岄渶瑕佷負const char*瀹氫箟鏁翠釜綾葷殑鐗瑰寲鐗堟湰:
template<>
class Queue<const char*>
{
public:
void push(const char*);
void pop() {real_queue.pop();}
bool empty() const {return real_queue.front();}
//榪斿洖綾誨瀷涓庢ā鏉垮弬鏁扮被鍨嬩笉鍚?/span>
std::string front() {return real_queue.front();}
const std::string &front() const {return real_queue.front();}
private :
Queue<std::string> real_queue;
};
緇橯ueue涓涓柊鐨勬暟鎹厓绱?string瀵硅薄鐨凲ueue銆傚湪綾葷殑澶栭儴瀹氫箟涓涓垚鍛?
void Queue<const char*>::push (const char* val)
{
return real_queue.push(val);
}
榪欎釜鍑芥暟閫氳繃璋冪敤read_queue鐨刾ush鍑芥暟鎶妚al鎸囧悜鐨勬暟緇勫鍒跺埌鏈懡鍚嶇殑string 瀵硅薄涓傚綋闇瑕佸嚭闃熷垪鐨勬椂鍊欒皟鐢ㄧ浉搴攔eal_queue.pop()鍑芥暟鍗寵繑鍥炰簡榪欎釜string錛屼粠鑰岃В鍐充簡涓嶇敤澶嶅埗鎸囬拡鐨勯棶棰樸?br />
3.鐗瑰寲鎴愬憳鑰屼笉鐗瑰寲綾誨湪涓婁緥鐨勫疄鐜頒腑錛屾垜浠彲浠ユ崲涓縐嶆柟娉曪紝鍗充笉闇瑕佺壒鍖栫被錛岃屽彧闇瑕佺壒鍖栫被鐨勬垚鍛樺嚱鏁皃ush銆乸op銆傛牴鎹嚱鏁版ā鏉跨壒鍖栫殑瑕佹眰錛?br />template <>
void Queue<const char*>::push(const char *const &val)
{
char * new_item = new char[strlen(val)+1];
strncpy(new_item, val, strlen(val)+1);
QueueItem<const char*> *pt = new QueueItem<const char*>(new_item);
if(empty())
head = tail = pt; //闃熷垪涓病鏈夊厓绱?/span>
eles{
tail->next = pt; //娣誨姞鏂板厓绱犲埌鍒楀熬
tail = pt;
}
}
template<>
void Queue<const char*>::pop()
{
QueueItem<const char*> *p = head;
delete head->item; //鍒犻櫎闃熼鍏冪礌
head = head->next; //鎸囧悜褰撳墠闃熼鍏冪礌
delete p; //鍒犻櫎闆舵椂鎸囬拡
}
4.綾繪ā鏉跨殑閮ㄥ垎鐗瑰寲
濡傛灉綾繪ā鏉挎湁涓涓互涓婄殑妯℃澘褰㈠弬錛屾垜浠緢鏈夊彲鑳藉彧瑕佺壒鍖栨煇浜涙ā鏉垮艦鍙?br /> 鑰屼笉鏄叏閮ㄥ艦鍙傘傝繖鏃舵垜浠氨闇瑕佷嬌鐢ㄧ被鐨勯儴鍒嗙壒鍖栥?br />//瀹氫箟妯℃澘綾?/span>
template <class T1, class T2>
class some_template{
// 
};
//瀹氫箟妯℃澘綾葷殑閮ㄥ垎鐗瑰寲錛歍2綾誨瀷鍥哄畾錛岄儴鍒嗙壒鍖朤1綾誨瀷
template<class T1>
class some_template<T1, int>{
// 
};
//浣跨敤綾繪ā鏉跨殑閮ㄥ垎鐗瑰寲
some_template<int, string> foo; //浣跨敤妯℃澘綾?/span>
some_template<string,int> bar; //浣跨敤妯℃澘綾葷殑閮ㄥ垎鐗瑰寲
閫氳繃浣跨敤妯℃澘鐗瑰寲鑳借В鍐充竴浜涘湪閫氬父鎴栬呴氱敤鎯呭喌涓嬫棤娉曡В鍐崇殑鐗規畩闂銆傚湪鎺屾彙浜嗗熀鏈殑璇硶瑙勮寖鍜屽疄鐜版柟娉曞悗渚垮彲浠ュ姞浠ュ簲鐢ㄣ?/span>
]]>
#include <cstring>
template <class T>
T mymax(const T t1, const T t2)
{
return t1 < t2 ? t2 : t1;
}
//妯℃澘鐗瑰寲
//鐗瑰寲涓虹粷瀵圭被鍨?br />//涓婅堪瀹氫箟涓璽emplate < >鍛婅瘔緙栬瘧鍣ㄨ繖鏄竴涓壒鍖栫殑妯℃澘銆傚茍涓斿湪澹版槑鐗瑰寲妯℃澘涔嬪墠涓瀹氳鏈夐潪鐗瑰寲鐨勫0鏄庯紒騫朵笖涓や釜綾葷殑鍚嶅瓧鏄竴鏍風殑錛?br />//鐗瑰寲鐨勬ā鏉垮繀欏繪斁鍦ㄩ潪鐗瑰寲鐨勬ā鏉跨殑涔嬪悗
//鍚﹀垯緙栬瘧鍣ㄦ緇欎綘鐪?濡備笅:
//'const char *mymax(const char *,const char *)' is not a specialization of a function template
template<>
const char* mymax(const char* t1,const char* t2)
{
return (strcmp(t1,t2) < 0) ? t2 : t1;
}
/*
闈炴ā鏉垮嚱鏁?br />闈炴ā鏉垮嚱鏁板叿鏈夋渶楂樼殑浼樺厛鏉?br />const char* mymax(const char* t1,const char* t2)
{
return (strcmp(t1,t2) < 0) ? t2 : t1;
}
*/
int main()
{
int highest = mymax(5,10);
char c = mymax('a', 'z');
const char* p1 = "hello";
const char* p2 = "world";
const char* p = mymax(p1,p2);
return 0;
}
]]>