我已经为此苦苦挣扎了大约半天,似乎至少 XCode 4.6 有一个错误,其中模板类的某些声明会违反语言并允许将 const 数据从类内传递到外部函数,参数被定义为没有常量修饰符。
下面的示例将编译,即使 Tcaller::call() 方法的严格模板声明指定作为引用传递的 const 参数,但静态 cmp 函数提供无用的 *const & 修饰符。
template< typename T> struct Tcalled
{
// !!!error - this prototype doesn't protect the data passed to function
// because it should be declared with const modifiers but it wouldn't compile then.
// SEE: Below my NOTE for correct function prototype.
static bool cmp(const Tcalled*& item, const int& key) //<- correct but doesn't work
static bool cmp(Tcalled* const & item, const int& key) //<- invalid but works!!
{
return (item->index = key); /// error - we modify const object here !
}
T index;
};
template < typename T> struct Tcaller
{
Tcaller(){}
template < typename K, bool (*compare)(const T& item, const K& key) >
bool call(int k) const { return compare(data, k); }
T data;
};
int main(int argc, char *argv[])
{
const Tcaller<Tcalled<int>* > tmp; // <- const data
int k = 1;
tmp.call<int,Tcalled<int>::cmp>(k); //call here WILL modify const data !!
}
问题是:我如何强制 XCode 遵守规则并允许我为我的静态函数创建原型,因为它是为模板参数声明的?至于现在,这些是我在正确声明静态方法时得到的 XCode 错误:
没有匹配的成员函数调用“调用”候选模板被忽略:模板参数“比较”的显式指定参数无效
谢谢!