다음 코드는 Visual Studio 2010에서는 컴파일되지만 Visual Studio 2012 RC에서는 컴파일되지 않습니다.Visual Studio 2012에서 C++ 컴파일 오류 : LPCWSTR 및 wstring
오류 C2440은 : '형식 캐스팅':
#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; }
오류는 반환 없음 생성자는 소스 유형을 수 없었다
'std::wstring'
에'CTestObj'
에서 변환 할 수 없습니다, 또는 생성자 오버로드 확인이 모호했다
저는 이미 변환 연산자 중 하나를 주석 처리하면 컴파일 문제가 해결된다는 것을 알고 있습니다. 난 그냥 이해하려면 :
- 무엇 's은 (는) 원인 후드 진행이
- 이 VS2010에서가 아니라 VS2012에서 컴파일 왜? C++ 11 변경 때문입니까?
어쩌면 그것은 버그 일 수 있습니다 ... – ildjarn
그럴 수도 있지만 내 직감은 내가 이해하지 못하는 급변하는 변화입니다. – jqcAngel
'연산자 LPCWSTR'을 쓰는 것은 어쩌면 나쁜 아이디어 일 것입니다. 'CTestObj foo()'함수를 가지고 있다면, 연산자는 자동으로'LPCWSTR x = foo();'를 허용하고, 이제는 해제 된 메모리에 대한 포인터를 갖게됩니다. – jamesdlin