我有一个问题,我们有一些重载函数,但是当它们被第二个参数调用不同类型时,它们总是调用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