gpt4 book ai didi

c++ - iPhone编译移植代码问题: sub class of template parameter base class inaccessible

转载 作者:行者123 更新时间:2023-11-30 03:11:17 25 4
gpt4 key购买 nike

检查一下:

template <class T>
class Test: public T
{
public:

void TestFunc()
{
T::SubClass bob;
}
};

在为 iPhone 编译时失败(预期为“bob”之前的“;”)。在其他平台上工作

这是我们实际尝试做的一个简化示例,它继承自 std::map<> 并在该类中创建一个迭代器。

最佳答案

经常遇到的问题。输入 typename:

template <class T>
class Test: public T
{
public:

void TestFunc()
{
typename T::SubClass bob;
}
};

T::SubClass 是一个从属名称。在解析模板时,编译器还不知道它是否是一个类型。为了仍然能够解析它(并收集由此获得的信息),它假定它不是一种类型。但是,该行必须是一个表达式,并且缺少两个名称之间的运算符。 typename 会告诉它这个名字是一个类型,然后这一行就变成了一个声明。


上面的失败原因可能并不明显,因为整行不能是表达式。但还有其他情况无法决定整个语句的形式:

T::SubClass * bob;

那是乘法还是指针声明?编译器会假设它是一个乘法。如果稍后在实例化模板时发现 T::SubClass 命名了一个类型,则会出现错误消息。 typename 也会在这里告诉编译器将其解析为声明而不是表达式(通过将 T::SubClass 作为类型)。

请注意,有些编译器可能在没有 typename 的情况下仍然可以工作(如果我没记错的话,MSVC 编译器就是其中之一)。我认为这应该带有那些编译器不会进行两阶段名称查找的限制:它们将在实例化时解析完整的模板,并且所有名称,甚至是那些在模板定义中不可见的名称,都将是发现(与标准所说的相反,它以不同的方式对待定义/实例化中的名称查找)。

访问模板常见问题解答以获得进一步帮助:C++ Templates FAQ

关于c++ - iPhone编译移植代码问题: sub class of template parameter base class inaccessible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com