c++ - iPhone SDK 3.2 上的模板编译错误

标签 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

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

所以两个问题: - 我对错误的解释是否正确? - 我该如何解决?

-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 ),因为名称的绑定(bind)将取决于基类是否class有没有这样的名字,被认为是不幸的。对于像 BinarySearch 这样的普通名称, 此外没有迹象表明该名称依赖于模板参数,因此标准要求编译器在实例化之前不要延迟查找名称。所以这个名字,即使在实例化时允许在依赖库中查找(这不是),无论如何也找不到。

您必须明确地告诉编译器通过限定它来查找封闭类,在这种情况下,编译器将在实例化时的查找过程中包含依赖的基类。前缀为 this或者类名也会​​使名称​​依赖,从而将查找延迟到实例化。这两个事实是它工作所必需的。

关于c++ - iPhone SDK 3.2 上的模板编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2883829/

相关文章:

iPhone通过左右滑动手指切换 View ,与stock app类似

c++ - 如何使用 CTypedPtrArray

c++ - 什么时候将全局变量的地址作为模板参数传递有用?

c++ - 将表达式评估为函数参数时,Visual Studio 2013 有符号/无符号整数数学行为不同,编译器开关?

C++ 用户错误,忽略变量条目

c++ - 在 C++ 中,如果一个成员引用在其声明中被初始化,为什么它需要存储空间?

android - 将一个圆圈分成不同的区域作为飞镖盘?

android - Gradle 找不到用于使用 NDK 进行调试的 OpenCV 库

iphone - 如何将 UITableView 添加到包含其他对象的父级?

WPF : Conditional templating of textblock