1

我正在从 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

经过一番摸索,我相信这里发生的事情是它试图将 BinarySearch 之前的“<”解析为“小于”运算符,出于某种原因。

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

-D

4

3 回答 3

0

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

/* 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或 类名前缀也会使名称依赖,从而延迟查找它直到实例化。这两个事实是它工作所必需的。

于 2010-05-21T18:49:48.060 回答
0

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

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

于 2010-05-21T17:26:31.560 回答
-1

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

编辑:您也可以尝试使用自动参数类型推导路线,并切断显式专业化。

于 2010-05-21T17:34:58.093 回答