使用泛型运算符 - > *作为右值

时间:2013-11-20 10:24:23

标签: c++ templates arm iar

编译过程:

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();    
}

我猜通用运算符的结果可以作为左值,但不是右值。取消参数没有帮助。

任何关于原因和解决方案的想法?

2 个答案:

答案 0 :(得分:0)

我们可以从edg\lower_il.c告诉我这是EDG前端,而不是专有的IAR解析器。 EDG维护良好且备受尊重,您可以在http://gcc.godbolt.org/使用更新版本。 (从编译器菜单中选择ICC。)

文件名表明它处理的是较低级别的中间表示,而不是构建初始AST。将指针到成员的访问转换为更原始的操作可能存在问题。或者标志可能出现在错误的行上。内部错误并不总是精确的。 SSCCE会更好。

答案 1 :(得分:0)

IAR服务包6.70.2解决了这个问题。