컴파일 과정 :일반 연산자를 사용하여 -> * r- 수치로
Tool internal error: Internal Error: [Front end]: assertion failed at: "....\Translator\compiler_core\src\parser\edg\lower_il.c", line 13411
사실 그 충격 : 비 기본 유형 T 사용할 때
template <typename T> T GetMember(const T STRUCT_T::* member)
{
STRUCT_T* pStruct = GetStruct();
...
// read value
T retVal = pStruct->*member; // compiler assertion here
ReleaseStruct();
return retVal;
}
인해 컴파일러 어서션 끝나는 IAR 컴파일러의 "lower_il.c"는 최소한 13,411 개의 라인을 가지고 있고 그 중 일부는 적절한 일반 연산자입니다 -> *(), 다음 함수가 비 기본 타입 T로 컴파일한다는 것을 알았습니다.
template <typename T> void SetMember(T STRUCT_T::* member, const T& value)
{
STRUCT_T* pStruct = GetStruct();
...
// write value
pStruct->*member = value; // no compiler assertion here
ReleaseStruct();
}
제네릭 연산자의 결과가 우변 값은 괜찮지 만 rvalue 값은 아닙니다. 매개 변수를 언 핑킹해도 도움이되지 않았습니다.
원인과 해결책에 대한 아이디어가 있으십니까?
컴파일러를 업그레이드하지 않으면 내부 컴파일러 오류에 "해결책"이 없습니다. 가장 좋은 방법은 해결 방법입니다. – dasblinkenlight
이것은 파서 오류처럼 보입니다. 'T retVal (pStruct -> * member)','T & retVal = pStruct -> * member', 또는'const T retValPtr * = & (pStruct -> * member) '와 같은 다른 구문을 사용하여 똑같은 것을 시도해보십시오. 회원)'. 간단히 말해, 컴파일러가 코드를 통해 다른 경로를 취하여 속여서 암기를 피하도록 무언가를하십시오. – dasblinkenlight
"T retVal = * & (pDbAppDynamic -> * member)"가 작동했습니다. @ dasblinkenlight 정말 고마워. 나는 이것이 어떻게 일어날 수 있었는지 아는 것에 관심이있다. – lkanab