C++ 参数类型转换

标签 c++ visual-c++ overloading visual-c++-6

我遇到了一个问题,我们有许多重载函数,但是当使用不同类型的第二个参数调用它们时,它们总是调用 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/

相关文章:

java - 如果我有一个 (Object...) 方法,为什么 Java 不调用 (List<Object>) 方法?

ios - 是否可以在 Swift 中重载 += 运算符?

c++ - 重载 C++ 运算符时运行特定代码

c++ - 如何在 C++ 中将数组 char 复制到字符串或 int* (void *)?

C++重绘窗口的一部分

c++ - 在 Visual Studio 项目目录中找不到头文件

c - 为什么 VS 2012 中出现此运行时 OpenGL 错误?

c++ - 将 3D MatND 拆分为 2D Mat opencv 的 vector

c++ - 字节序是否影响写入奇数个字节?

c++ - C++11 是否改变了对 STL 容器元素的要求,以及如何改变?