Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ IPhone编译移植代码问题:模板参数基类的子类无法访问_C++_Iphone_Templates_Compiler Construction - Fatal编程技术网

C++ IPhone编译移植代码问题:模板参数基类的子类无法访问

C++ IPhone编译移植代码问题:模板参数基类的子类无法访问,c++,iphone,templates,compiler-construction,C++,Iphone,Templates,Compiler Construction,看看这个: template <class T> class Test: public T { public: void TestFunc() { T::SubClass bob; } }; 模板 等级考试:公共T { 公众: void TestFunc() { T::子类bob; } }; 为iPhone编译时,此操作失败(应在“bob”之前输入“;”。在其他平台上工作 这是一个简化的示例,说明了我们实际要做的事情,即从std::map

看看这个:

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

    void TestFunc()
    {
        T::SubClass bob;
    }
};
模板
等级考试:公共T
{
公众:
void TestFunc()
{
T::子类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
作为类型)

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


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

lol,lame…谢谢。通过将:typedef typename std::map::iterator iterator;添加到从std::map继承的类中,修复了我的问题。酷,是的,我可以看出这可能是一个问题。当我实际实例化Test并在其上调用TestFunc时,Iphone编译器确实提出了更多问题错误,实际上建议我在前面加上typename!我们在移植过程中遇到的最大问题是,很多模板化的东西实际上从未被调用,所以其他编译器只是完全忽略了它们!甚至没有发现明显的语法错误。我猜单元测试ftw。。。
T::SubClass * bob;