以下代码在Visual Studio 2010中编译,但无法在Visual Studio 2012 RC中编译。
#include <string>
// Windows stuffs
typedef __nullterminated const wchar_t *LPCWSTR;
class CTestObj {
public:
CTestObj() {m_tmp = L"default";};
operator LPCWSTR() { return m_tmp.c_str(); } // returns const wchar_t*
operator std::wstring() const { return m_tmp; } // returns std::wstring
protected:
std::wstring m_tmp;
};
int _tmain(int argc, _TCHAR* argv[])
{
CTestObj x;
std::wstring strval = (std::wstring) x;
return 0;
}
返回的错误是:
错误C2440:'输入':无法从
'CTestObj'
转换为'std::wstring'
没有构造函数可以采用源类型,或者构造函数重载解析是不明确的
我已经意识到注释掉任何转换运算符都会修复编译问题。我只想了解:
答案 0 :(得分:1)
如果我理解了引擎盖下的逻辑,那么运算符重载试图在每次转换时复制代码和对象。因此,您需要return it as a reference而不是尝试根据字段返回新对象。这一行:
operator std::wstring() const { return m_tmp; }
应该是:
operator std::wstring&() { return m_tmp; }
以下编译并按预期运行。
#include <string>
// Windows stuffs
typedef __nullterminated const wchar_t *LPCWSTR;
class CTestObj {
public:
CTestObj() {m_tmp = L"default";};
operator LPCWSTR() { return m_tmp.c_str(); } // returns const wchar_t*
operator std::wstring&() { return m_tmp; } // returns std::wstring
protected:
std::wstring m_tmp;
};
int main()
{
CTestObj x;
std::wstring strval = (std::wstring) x;
wprintf(L"%s\n", strval.c_str());
return 0;
}