编译过程:
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;
}
当与非基本类型T一起使用时,由于编译器断言而结束:
工具内部错误: 内部错误:[前端]:断言失败: “.... \ Translator \ compiler_core \ src \ parser \ edg \ lower_il.c”,第13411行
由于IAR编译器的“lower_il.c”至少有13,411行并且其中没有一行是正确的泛型运算符 - &gt; *()这一事实让我感到震惊,我发现下面的函数用非编译编译它甚至更奇怪 - 基本类型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();
}
我猜通用运算符的结果可以作为左值,但不是右值。取消参数没有帮助。
任何关于原因和解决方案的想法?
答案 0 :(得分:0)
我们可以从edg\lower_il.c
告诉我这是EDG前端,而不是专有的IAR解析器。 EDG维护良好且备受尊重,您可以在http://gcc.godbolt.org/使用更新版本。 (从编译器菜单中选择ICC。)
文件名表明它处理的是较低级别的中间表示,而不是构建初始AST。将指针到成员的访问转换为更原始的操作可能存在问题。或者标志可能出现在错误的行上。内部错误并不总是精确的。 SSCCE会更好。
答案 1 :(得分:0)
IAR服务包6.70.2解决了这个问题。