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;