2014-12-06 19 views
1

아래 예제와 같이 rapidjson 라이브러리를 Microsoft ATL CString 형식으로 사용하려고합니다.rapidjson 및 ATL CString 사용

#include "stdafx.h" 
#include "rapidjson\document.h" 

using namespace rapidjson; 
typedef GenericDocument<UTF16<> > WDocument; 

int main() 
{ 
    WDocument document; 
    CString hello = _T("Hello"); 
    document.SetObject(); 
    document.AddMember(_T("Hello"), hello, document.GetAllocator()); 
    return 0; 
} 

이 컴파일러 오류와 함께 실패

'rapidjson :: GenericValue :: GenericValue (rapidjson :: GenericValue & &)'rapidjson '에'CString을 '에서 인수 1을 변환 할 수 없습니다 :: 'rapidjson document.h'를 입력하면 rapidjson이 필요로하는 형식과 CString 사이의 변환이 필요하다는 것을 의미합니다. 1020

rapidjson은 내부적으로 wchar_t를 UTF16 버전의 인코딩으로 사용한다는 것을 알고 있지만, CString을 wchar_t (또는 wchar_t 배열)로 변환하는 방법을 rapidjson이 문자열을 사용할 수있는 방법으로 확신하지 못합니다. _T 매크로로 정의 된 문자열을 사용합니다.

문자열 유형 here 사이에서 변환 할 때 msdn 자원을 살펴 보았습니다. 그러나이 방법은 rapidjson에서 사용할 수없는 wchar_t 배열의 첫 번째 멤버에 대한 포인터를 반환하는 방법을 제공합니다.

+0

당신이 유니 코드 빌드를 구축, 또는 다른 ANSI 빌드에서'CStringW'와'L "안녕하세요"'(사용 확인 ,'CString'은'wchar_t'가 아니라'char's를 저장합니다). 'const wchar_t *'(CStringW는 적절한 변환 연산자를 제공)로 명시 적으로 형변환해야 할 수도 있습니다. –

+1

이것을 제안 해 주셔서 감사합니다. wchar_t *로 캐스팅하는 아이디어는 지금해야 할 일을 파악하는 데 도움이되었습니다. –

답변

1

올바른 방법은 rapidjson이 GenericValue 클래스에 제공하는 생성자 중 하나, 즉 문자 인코딩 유형 및 문자 길이에 대한 포인터 생성자를 사용하는 것입니다.

GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_(), flags_() { SetStringRaw(StringRef(s, length)); } 

이 생성자는 rapidjson이 길이와 함께 허용하는 모든 문자 유형에 대한 포인터를 취하여이를 값으로 읽을 수 있습니다. ATL :: CString 클래스의 경우 CString 개체에서 사용할 수있는 .GetString().GetLength() 메서드를 사용하여이 작업을 수행 할 수 있습니다. 함수는 다음과 같이 것 DOM 트리에 사용할 수있는 값을 반환 :

typedef GenericValue<UTF16<> > WValue; 

WValue CStringToRapidjsonValue(CString in) 
{ 
    WValue out(in.GetString(), in.GetLength()); 
    return out; 
}