代码之家  ›  专栏  ›  技术社区  ›  matt

iPhone移植代码编译问题:模板参数基类子类不可访问

  •  1
  • matt  · 技术社区  · 15 年前

    看看这个:

    template <class T>
    class Test: public T
    {
    public:
    
        void TestFunc()
        {
            T::SubClass bob;
        }
    };
    

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

    这是我们实际上试图做的一个简化的例子,它继承了一个STD::map & lt & gt;在该类中,创建一个迭代器。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Johannes Schaub - litb    15 年前

    经常遇到问题。放 typename :

    template <class T>
    class Test: public T
    {
    public:
    
        void TestFunc()
        {
            typename T::SubClass bob;
        }
    };
    

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


    可能不太清楚为什么它在上面失败了,因为整行不能是一个表达式。但也有其他情况无法决定整个陈述的形式:

    T::SubClass * bob;
    

    这是乘法还是指针声明?编译器将假定它是一个乘法。如果稍后在实例化模板时发现 T::子类 命名一个类型,它将引发一条错误消息。 类别名 还将在这里告诉编译器将其作为声明而不是表达式来解析(通过 T::子类 作为一种类型)。

    请注意,有些编译器可能仍然在没有 类别名 (如果我记得对的话,MSVC编译器就是其中之一)。我认为这应该受到这样的限制,即那些编译器不会进行两阶段名称查找:他们将在实例化时解析整个模板,并且将找到所有名称,甚至那些在模板定义中不可见的名称(与标准所说的相反,that在定义/实例化时处理名称查找的方式不同)。

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