6

다음 코드는 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'에서 변환 할 수 없습니다, 또는 생성자 오버로드 확인이 모호했다

저는 이미 변환 연산자 중 하나를 주석 처리하면 컴파일 문제가 해결된다는 것을 알고 있습니다. 난 그냥 이해하려면 :

  1. 무엇 's은 (는) 원인 후드 진행이
  2. 이 VS2010에서가 아니라 VS2012에서 컴파일 왜? C++ 11 변경 때문입니까?
+0

어쩌면 그것은 버그 일 수 있습니다 ... – ildjarn

+0

그럴 수도 있지만 내 직감은 내가 이해하지 못하는 급변하는 변화입니다. – jqcAngel

+2

'연산자 LPCWSTR'을 쓰는 것은 어쩌면 나쁜 아이디어 일 것입니다. 'CTestObj foo()'함수를 가지고 있다면, 연산자는 자동으로'LPCWSTR x = foo();'를 허용하고, 이제는 해제 된 메모리에 대한 포인터를 갖게됩니다. – jamesdlin

답변

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; 
} 
+0

이것은 오래 전에 응답되었을 것입니다. 긴 대기 시간에 대한 나의 동정심! – Qix

+1

그리고이 답변을 수락하는 데 너무 오래 걸려서 죄송합니다. 정말 고맙습니다. – jqcAngel

+0

문제 없음 :] – Qix

관련 문제