iPhone SDK 3.2上的模板编译错误

时间:2010-05-21 16:32:58

标签: c++ iphone templates iphone-sdk-3.2

我正在移植一些来自Windows的模板化代码,而且我在iPhone 3.2 SDK上遇到了一些编译器差异。

类模板的成员函数中的原始代码是:

return BinarySearch<uint32, CSimpleKey<T> >(key);

其中BinarySearch是从另一个模板继承的方法。

这会产生以下错误:

csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)'

Visual Studio编译器似乎很好地提升了模板层次结构,但是gcc需要我完全限定函数的来源(我通过修复与模板成员变量相同的问题来验证这一点)。

所以我现在需要将其更改为:

return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key);

现在产生以下错误:

csimplekeytable.h:132: error: expected primary-expression before ',' token
csimplekeytable.h:132: error: expected primary-expression before '>' token

经过一番头疼之后,我相信这里发生的事情是它正试图解决'&lt;'之前BinarySearch作为'Less Than'运算符出于某种原因。

所以有两个问题:     - 我是否在正确的道路上解释错误?     - 我该如何解决?

-D

3 个答案:

答案 0 :(得分:0)

可能这只是uint32 typedef的问题。可能是它在新环境中不可用。在第一种情况下,名称空间分辨率选择NEngine :: uint32,在第二种情况下它根本不选择任何东西(因此解析错误)。

我建议在Windows上查找如何定义uint32,并尝试复制该定义。

答案 1 :(得分:0)

如果CSimpleTable是基类,则需要使用该基类名称或this限定您的调用。但由于这两者都依赖于模板参数,因此编译器无法查找名称BinarySearch的含义。它可以是一个静态整数常量,您可以将其与其他内容进行比较,或者它可以是一个模板,您可以将参数括在<...>中。您需要告诉编译器有关后者的信息

/* the "::template" means: 'the name that follows is a template' */
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key);

this

return this->template BinarySearch<uint32, CSimpleKey<T> >(key);

资格认证的原因是编译器不会在依赖于模板参数的基类中查找非限定名称(在您的情况下参数为T),因为名称的绑定取决于是否基类有这样的名字,这被认为是不幸的。对于像BinarySearch这样的普通名称,此外没有任何迹象表明此名称取决于模板参数,因此标准要求编译器在实例化之前不要延迟查找名称。因此无论如何都无法找到名称,即使在实例化(不是)中允许在依赖基础中查找。

您必须明确告诉编译器通过限定它来查看封闭类,在这种情况下,编译器在实例化时将在查找期间包含依赖基类。使用this或类名称进行前缀也会使名称​​依赖,从而延迟查找它直到实例化。它需要这两个事实才能发挥作用。

答案 2 :(得分:-1)

也许是因为你的间距不一致。您已完成CSimpleTable<CSimpleKey<T> >,而不是CSimpleTable<CSimpleKey<T>>。我相信它们都应该是有效的,但也许有一个解析器错误。

编辑:您还可以尝试按下自动参数类型扣除路线,并切断显式专业化。