Visual Studio 2017 15.5로 업데이트 하면 ConformanceMode란 놈을 디폴트로 켜버린다.
C++ 표준을 준수하게 하는 모드라고 한다.(니미 난 내 제품 만드는게 중요한데 C++표준이 알게 뭐냐. 사실상 게임업계에선 MSVC가 표준이지.)
이전에 만든 프로젝트라면 상관없지만 새로 만드는 프로젝트는 ConformanceMode가 켜지게 된다.
pure UWP 프로젝트는 아직 테스트 안해봤지만 Desktop App에서 C++/CX를 이용해서 UWP API를 호출하는 경우 문제가 된다.
ConformanceMode가 켜진 상태에서 데스크탑 프로젝트에서 Consume Wndows Runtime Extention을 켜면 다음과 같은 에러가 뜬다.
1>c1xx : warning C4199: two-phase name lookup is not supported for C++/CLI, C++/CX, or OpenMP; use /Zc:twoPhase-
일단 경고가 뜨는데 이 이후로 에러가 왕창 뜨기 때문에 이건 경고가 아니고 사실상 에러다.
그래서 /Zc:twoPhase- 옵션을 지정하면…
HttpClient^ httpClient = ref new HttpClient(); auto task_get = create_task(httpClient->GetAsync(uri));
이런 코드의 경우 다음과 같이 에러가 뜬다. 물론 돋같은 템플릿 특성상 에러메시지는 create_task()가 호출된 코드 위치를 알려주지도 않는다.
1>c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.12.25827\include\ppltasks.h(858): error C2065: ‘_M_asyncInfo’: undeclared identifier
즉 ppl의 create_task()에 UWP API를 넣을수 없다. create_task()를 안쓰고 C++/CX만으로 UWP API를 호출할 방법이 없는건 아닌데 한줄로 될걸 열줄쯤 짜야하니까 미치지.
이거 땜에 한참 시간 낭비했다. 결국 예전 프로젝트 파일과 비교해보고 저 옵션 문제인걸 알았다.
이 미친놈들이 ppl에서 문제 되는건 해결을 먼저 했어야지. 분명히 테스트도 안해봤을거야.
Fucking Microsoft.
하여간 해결책은 간단하다. 프로젝트 세팅에서 ConformanceMode를 no로 설정한다.
님 글 덕분에 코드 에러가 잘 해결되었네요. 땡큐 베리 감사합니다^^
좋아요좋아요