Vulkan 및 Visual Studio 2017을 사용하는 렌더링 엔진에서 작업 중이며 최근 다음과 같은 유형의 문제가 발생했습니다.Visual Studio에서 constexpr 표현식에 관한 컴파일 문제 20130
템플릿 구조체가 template<uint32_t id> struct A;
입니다. 이 구조체는 별도의 헤더 파일에 id=0, ... , N-1
에 대해 정의됩니다. 정의 중 일부는 B
구조체에 대해 static constexpr std::array<B, M(id)> member
이고 id
에 따라 숫자는 M
입니다. 나는 주어진 값으로 b
타입이 B
인 constexpr 함수 (그리고 도우미 함수)가 b
과 같은 배열의 몇개 요소를 포함하는지 계산한다.
도우미 기능 :
template<size_t Size>
constexpr void count_in_array(B b, const std::array<B, Size>& a, uint32_t& count)
{
for(auto& e : a)
{
if(e==b)
++count;
}
}
주요 기능 :
template<uint32_t... ids>
constexpr uint32_t count_in_arrays(B b, std::index_sequence<ids...>)
{
uint32_t count=0;
auto l ={ (count_in_array(b, A<ids>::member, count), 0)... };
return count;
}
내가 컴파일, 나는 C1001 내부 컴파일러 오류는 다음과 같이 보입니다. 이상한 것은 변수 constexpr
constexpr uint32_t var=count_in_arrays(b, std::make_index_sequence<N>());
(A constexpr B b
에 대한)를 정의하기 위해 내가 그들을 사용하는 경우 때문에 내 함수들이 그냥이 작동한다는 것입니다, 그리고 내가 계산 된 (그리고 올바른)를 참조하십시오, 그 변수 위에 마우스를 후버 나타나는 직사각형의 숫자.
필자는 컴파일러 스위치에 익숙하지 않아 위의 기능들에 대해서만 #pragma optimize("", on/off)
을 사용하려했지만 도움이되지 않았습니다. 누군가 내 코드를 컴파일하기 위해 Visual Studio를 만드는 방법을 알고 있습니까?
비고 : 여기서는 struct B
이 중요하지 않다고 확신합니다. 제 경우에는 내장 된 변수가 들어있는 간단한 데이터 구조체입니다.
내부 컴파일러 오류는 항상 컴파일러의 버그입니다. 그래서 당신의'struct B'조차도 중요 할 수 있습니다. [MCVE] (https://stackoverflow.com/help/mcve)를 만들면 컴파일러 오류가 발생하고 MSVC에보고 할 수 있습니다. –
예, 컴파일러가 코드를 거부하더라도 (예 : 일부 새로운 기능을 지원하지 않기 때문에), ICE하지 않아야합니다. 내가 한 가지 제안하고자하는 것은 프로젝트 설정 (프로젝트 -> 속성, C/C++ -> 언어로 이동하여 "C++ 언어 표준"을 C++ 17 또는 최신 버전으로 설정하는 것입니다.)이 문제를 해결할 것인지 모르겠습니다. 적어도 유익한 진단 정보를 줄 수는 있습니다 – SoronelHaetir
MCVE가 무엇인지 모르겠습니다 (링크 덕분에), 제가 확인하고 있습니다. – Sandor