Visual Studio 2012中的C ++编译错误:LPCWSTR和wstring

时间:2012-06-01 00:10:27

标签: c++ visual-studio-2010 visual-c++ wstring visual-studio-2012

以下代码在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'
  没有构造函数可以采用源类型,或者构造函数重载解析是不明确的

我已经意识到注释掉任何转换运算符都会修复编译问题。我只想了解:

  1. 引发了什么引发了这个
  2. 为什么这个在VS2010而不是在VS2012中编译?是因为C ++ 11的变化吗?

1 个答案:

答案 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;
}