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.
工具/软件: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