此错误:
错误C2664:'Set :: Set(int(__ cdecl *)(ElemType,ElemType))' :无法从'int(__ cdecl。)转换参数1 *)(CorrectionT&,CorrectionT&)'to'int(__ cdecl *)(ElemType,ElemType)'
是将此比较函数实现为基于BST的SET类
的一部分的结果int compareCorr(struct CorrectionT &a, struct CorrectionT &b)
{
if (a.editDistance < b.editDistance) return -1;
else if (a.editDistance == b.editDistance) return 0;
else return 1;
}
课程集
Set(int (*cmpFn)(ElemType, ElemType) = OperatorCmp);
并且在Set中使用比较函数是为了添加
template <typename ElemType>
void Set<ElemType>::add(ElemType element) {
bst.add(element);
}
并在bst类中添加 重述头文件
BST(int (*cmpFn)(ElemType one, ElemType two) = OperatorCmp);
和功能添加
template <typename ElemType>
bool BST<ElemType>::add(ElemType data) {
bool createdNewNode = false;
recAddNode(root, data, createdNewNode);
if (createdNewNode) timestamp++;
return createdNewNode;
}
template <typename ElemType>
bool BST<ElemType>::recAddNode(nodeT * & t, ElemType & data,
bool & createdNewNode) {
if (t == NULL) {
t = new nodeT;
t->data = data;
t->bf = BST_IN_BALANCE;
t->left = t->right = NULL;
createdNewNode = true;
numNodes++;
return true;
}
int sign = cmpFn(data, t->data);
if (sign == 0) {
t->data = data;
createdNewNode = false;
return false;
}
int bfDelta = 0;
if (sign < 0) {
if (recAddNode(t->left, data, createdNewNode)) {
bfDelta = -1; /* left subtree is higher */
}
} else {
if (recAddNode(t->right, data, createdNewNode)) {
bfDelta = +1; /* right subtree is higher */
}
}
updateBF(t, bfDelta);
return (bfDelta != 0 && t->bf != BST_IN_BALANCE);
}
知道这里发生了什么 - 比较功能有什么问题?
答案 0 :(得分:1)
compareCorr
的类型为int(Lexicon::CorrectionT&, Lexicon::CorrectionT &)
。它的参数是参考。
cmpFn
的类型,即构造函数的参数,为int(*)(ElemType, ElemType)
。它的参数是对象(不是引用)。
类型必须匹配。假设ElemType
是Lexicon::CorrectionT
,您必须将函数指针类型更改为具有引用参数类型,或者将比较器类型更改为具有对象参数类型。 (如果你去参考路线,它们都应该使用const引用,因为比较器不应该改变对象。)
或者,您可以执行STL所做的操作,并使比较器成为类型的一部分,允许使用任意函数对象进行比较。然后,比较器只需要具有与被比较对象类型兼容的类型参数(即,事物不需要精确匹配)。