我遇到了一个问题,我们有许多重载函数,但是当使用不同类型的第二个参数调用它们时,它们总是调用 CString
版本,而不是适当的重载。
函数的想法是作为一种基于键从缓存中获取和存储值的方法,但问题是编译器选择调用错误的函数。
函数的定义是:
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
我们在 Windows XP 和 7 上使用 Visual Studio 6 作为编译器(不,升级不是我希望的那样)。
最佳答案
我认为这是因为 CString 可以从任何其他类型生成。您可能会发现需要使 CString 版本具有不同的签名 - 也许添加另一个整数或类似的东西。
但也许更好的解决方案是为 CString 包装一个包装器,这样即使其他版本合适,编译器也不会自动选择 CString 版本。
例如,
class CStringWrapper
{
CStringWrapper(CString &x) : wrapped(x) {} explicit;
private:
CString& wrapped;
};
现在,编译器不会自动转换为 CStringWrapper
。当然,这意味着您必须使用 CStringWrapper(mystring)
来调用采用 CString
的函数,但我想这比所有东西都是 CString 更糟糕
。
关于C++ 参数类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14684936/