我正在从Windows上移植一些模板代码,并且在iPhone 3.2 SDK上遇到了一些编译器差异。

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

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

其中二进制搜索是从另一个模板继承的方法。

这会产生以下错误:

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

经过一些头部划痕,我相信这里发生的事情是,由于某种原因,它试图在二进制搜索之前解决二进制搜索之前的“ <'<”。

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

-d

有帮助吗?

解决方案

如果 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 否则班级名称也将成为名称 依赖, ,从而将其延迟到实例化。这两个事实才能起作用。

其他提示

也许这只是一个问题 uint32 Typedef。可能是在新环境中不可用。在第一种情况下,命名空间分辨率选择了Nengine :: uint32,在第二种情况下,它根本没有选择任何内容(因此解析错误)。

我建议您寻找在Windows上定义UINT32的方式,并尝试将该定义复制。

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

编辑:您还可以尝试沿着自动参数类型扣除途径,并切碎明确的专业化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top