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