我有一個問題,我們有一些重載函數,但是當它們被第二個參數調用不同類型時,它們總是調用CString
版本,而不是適當的過載。C++參數類型轉換
帶有函數的想法是作爲一種基於密鑰從緩存中獲取和存儲值的方法,但問題是編譯器選擇調用錯誤的函數。
的函數的定義是:
bool GetProcessDataItem(LPCTSTR lpszName, CString& strValue, int iIndex = 0, bool bLeveled = false);
bool GetProcessDataItem(LPCTSTR lpszName, int& iValue, int iIndex = 0, bool bLeveled = false);
bool GetProcessDataItem(LPCTSTR lpszName, long& lValue, int iIndex = 0, bool bLeveled = false);
bool GetProcessDataItem(LPCTSTR lpszName, double& dValue,int iIndex = 0, bool bLeveled = false);
bool GetProcessDataItem(LPCTSTR lpszName, ATime& tmValue,int iIndex = 0, bool bLeveled = false);
void SetProcessDataItem(LPCTSTR lpszName, const CString& strValue, int iIndex = 0, bool bLeveled = false);
void SetProcessDataItem(LPCTSTR lpszName, int& iValue, int iIndex = 0, bool bLeveled = false);
void SetProcessDataItem(LPCTSTR lpszName, long& lValue, int iIndex = 0, bool bLeveled = false);
void SetProcessDataItem(LPCTSTR lpszName, double& dValue, int iIndex = 0, bool bLeveled = false);
void SetProcessDataItem(LPCTSTR lpszName, ATime& tmValue, int iIndex = 0, bool bLeveled = false);
所以下面的工作確定:
const CString aString = "blah"
SetProcessDataItem("FOO", aString));
CString tmpString; //to be populated by the Get() call below
GetProcessDataItem("FOO", tmpString); //tmpString == "blah"
但這並不:
const double aDouble = 123;
SetProcessDataItem("FOO", aDouble)); //Calls the CString overloaded function (which doesn't convert double -> CString properly, so we get jibberish!)
double tmpDouble = 0;
GetProcessDataItem("FOO", tmpDouble); //Calls the CString overloaded function and gets the gibberish that was originally passed in above
我們使用Visual Studio 6作爲我們的編譯器(不,升級不是我希望的那樣多),在Windows XP和7上。
這似乎是編譯器中的一個嚴重錯誤。你有沒有嘗試過做一個明確的類型轉換(如果不需要的話)?此外,哪些重載被調用,有或沒有'const CString&'? –
大多數所謂的C++編譯器都不完全符合標準,但MSVC 6如此陳舊而且破損,實在不配稱爲C++編譯器。此外,請認識到我們對您的問題的回答可能不適用於VC6,因爲它們通常基於標準C++。 – PlasmaHH