This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:ARM CGT v5.2.5基类中模板参数的问题

Guru**** 2055400 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/711785/compiler-arm-cgt-v5-2-5-issue-with-template-argument-in-base-class

工具/软件:TI C/C++编译器

您好!

在基类中使用模板参数时遇到问题。 看起来编译器根本没有注意到基类。 即使我的实际代码更复杂、以下代码片段也会演示此问题:

模板
Foo 类

   公共:
       T1 P1;
       虚拟空转储(){
           printf ("%08X:%i\n"、这个、P1);
       }
};

模板
酒吧:公共场所

   公共:
       T2 P2;
       虚拟空转储(){
           printf ("%08X:%i、%i\n"、此、P1、P2); // 错误#20:标识符"P1"未定义
       }
};

void test()

       条形图 酒吧;
       bar.p1 = 1;//还可以!!!!
       bar.p2=2;
       bar.dump();

在派生类的实现中访问基类成员会抛出编译器错误#20 (未定义标识符)。 从班级外部执行同样的操作似乎是有效的。

相同的代码适用于 MS VC。

我使用的是 DM814x、SYS/BIOS v6.35.06.56、XDCTools v3.25.06.96和 ARM CGT v5.2.5。 (我很快就尝试更新到 ARM CGT 18.1.2,尽管 libcxx 包含文件中存在一些其他问题,但它似乎也有相同的问题...)

有什么想法吗?

谢谢、Lars

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Lars Beikirch"]在派生类的实现中访问基类成员会抛出编译器错误#20 (未定义标识符)。

    使用最新版本的 GNU g++时、我会遇到类似的错误。  因此、我相信 TI 编译器是正确的。  我确定您需要更多的解释。  我在这方面得到了一些帮助。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    模板将被解析两次:一次是首次看到模板时、另一次是实例化模板时。 在第一轮中、T1和 T2是未知占位符类型、而在第二轮中、它们是已知的类型 。

    在您发布的代码中、Foo 是 Bar 的依赖基类、这意味着在已知 T1和 T2的第二次 Bar 被解析之前无法确定其对 Bar 的贡献。 在处理从属基类时,默认名称查找不起作用,因为要考虑添加以下 Foo 专业化认证时会发生什么情况:

    模板<>
    类 Foo 
    {
    公共:
    虚拟空转储(){
    printf ("%08X:\n"、此);
    }
    }; 

    现在、根据"T1"的类型、代码可能是错误的、也可能不是错误的。 由于语言在解析 T1和 T2未知的模板时无法确定这一点、因此它必须将检查推迟到稍后、当它确实知道时。 此外、它必须是保守的、并假设由于没有可用的全局'P1'、它是对未定义变量的引用。

    我们如何解决这个问题? 我们可以稍后通过将引用链接到"P1"到相关实体来推迟名称查找。 由于关联基类继承导致 Bar 受依赖、因此我们可以通过'this'指针引用 P1。 编译以下代码。

    #include 
    
    模板 
    Foo 类
    {
    公共:
    内部 P1;
    虚拟空转储(){
    printf ("%08X:%i\n"、这、P1);
    }
    };
    
    模板 
    酒吧:公共场所 
    {
    公共:
    T2 P2;
    虚拟空转储(){
    printf ("%08X:%i、%i\n"、这、this->P1、P2); //通过相关的'this'指针引用从属成员变量
    }
    };
    
    void test()
    {
    条形图 酒吧;
    bar.p1 = 1;//还可以!!!!
    bar.p2=2;
    bar.dump();
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 James:

    非常感谢您的详细解释和解决我的问题的建议。 现在工作正常。 )

    BR、Lars