從VC6.0平臺級到VS2008平臺(之二) 收藏
3、模板特殊化(Template specialization)
模板的特殊化是當模板中的pattern有確定的類(lèi)型時(shí),模板有一個(gè)具體的實(shí)現。例如假設我們的類(lèi)模板pair 包含一個(gè)取模計算(module operation)的函數,而我們希望這個(gè)函數只有當對象中存儲的數據為整型(int)的時(shí)候才能工作,其他時(shí)候,我們需要這個(gè)函數總是返回0。這可以通過(guò)下面的代碼來(lái)實(shí)現:
template <class T>
class Pair {
T value1, value2;
public:
Pair (T first, T second){
value1=first;
value2=second;
}
T module () {return 0;}
};
template <>
class Pair<int> {
int value1, value2;
public:
Pair (int first, int second){
value1=first;
value2=second;
}
int module ();
};
//在模板特例化中,NET的特性
template<> int Pair<int>::module() {
return value1%value2;
}
這里要注意,在.NET中template<>是不需要的,否則會(huì )發(fā)生
Compiler Error C2910
Error Message
'function' : cannot be explicitly specialized錯誤,
見(jiàn):http://msdn.microsoft.com/en-us/library/cx7k7hcf(VS.80).aspx
4、STLport VS VS2008:
因為VC6對標準C++的支持不夠,所以我們用了STLport庫,然而在VS2008下MS的已經(jīng)差不多和標準相同了啊,所以,沒(méi)有必要在使用STLport庫。在整理工程中,把其去掉。
5、舊的CRT庫和新的安全CRT庫引起的C4996告警
解決了環(huán)境變量設置不匹配導致的問(wèn)題后,編譯過(guò)程就真正開(kāi)始了,不過(guò)首先映入眼簾的應該是成堆的C4996編譯告警,對每個(gè)使用了含字符串參數的CRT庫函數都會(huì )有C4996編譯告警,一個(gè)典型的輸出如下所示:
f:\project\.....\commonfunc.cpp(280) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
e:\software\microsoft visual studio 9.0\vc\include\string.h(74) : see declaration of 'strcpy'
MSDN online 是這樣解釋的:為了顯著(zhù)增加CRT庫的安全性,許多CRT函數都有了一個(gè)更安全的新版本,新版本和舊版本的區別就是新版本函數名多了一個(gè)_s后綴。只要一個(gè)CRT函數有新的安全版本,編譯器就會(huì )產(chǎn)生一個(gè)C4996告警,不過(guò),出現這個(gè)告警的目的并不是說(shuō)舊版本的CRT函數將淡出CRT庫,告警出現只是為了提醒程序員這個(gè)函數有更安全的版本存在。一種安全的或者是被鼓勵的做法是用安全版本的函數替換現有的CRT函數,不過(guò)對于一個(gè)有相當代碼量的項目,替換工作量也是巨大的,這可不是用名稱(chēng)查找、替換就能簡(jiǎn)單解決的問(wèn)題,因為許多安全版本的CRT函數參數個(gè)數也發(fā)生了變化。也可以用預處理指令消除這個(gè)告警:
#pragma warning( disable : 4996 )
或者定義 _CRT_SECURE_NO_WARNINGS 壓制這個(gè)告警(在stdafx.h中define或在項目屬性中設置預處理符號,PreProcessor Definitions)。
除了C語(yǔ)言的CRT函數外,POSIX 兼容函數也存在這個(gè)告警,解決方法是用POSIX標準名稱(chēng)替換(比如access換成_access)或者是定義 _CRT_NONSTDC_NO_WARNINGS 壓制這個(gè)告警(方法同上)。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。