我查看了以下主题,但它们似乎无法解决问题:
Function pointer to member function - 此线程无效,因为访问是在main而非另一个类
中进行的 one class should invoke method of another class using a function pointer - 我无法遵循接受的答案,因为我不清楚如何使用<functional>
标题。
我有一个 U seful F unction类UF
,我在其中声明并定义了我的程序的所有常用实用程序函数。其中一个功能是
int UF::compar_dbl_asc(const void *a, const void *b)//comparator for sorting
{ //array of double in ascending order
int aa = *((int *)a), bb = *((int *)b);
if (base_arr_dbl[aa] < base_arr_dbl[bb])
return -1;
if (base_arr_dbl[aa] == base_arr_dbl[bb])
return 0;
if (base_arr_dbl[aa] > base_arr_dbl[bb])
return 1;
}
这是一个比较器函数,我打算在qsort()
内使用它来按升序对双精度进行排序。
在UF
类定义中,我还有double* base_arr_dbl;
作为声明。这是qsort将使用的值(双精度)数组。
现在,在名为SEP
的我的另一个类中,我有一个函数fn1
,其中我希望base_arr_dbl
指向本地(fn1
)double数组,我想使用qsort
中的比较器函数调用UF
。虽然可能不需要非常具体,但我不对实际值的数组进行排序,而是对索引数组sortedindices[]
进行排序,这样sortedindices[0]
将保存最小条目的索引。 base_arr_dbl[]
数组。也就是说,排序顺序为base_arr_dbl[sortedindices[0]], base_arr_dbl[sortedindices[1]]
等。
所以,我这样做:
void SEP::fn1(UF *uf) {
double ratio[100];
//populate ratio's entries
//Now, sort ratio's entries.
uf->set_base_arr_dbl(ratio); //This function is defined as
//void UF::set_base_arr_dbl(double *ptr) { base_arr_dbl = ptr; }
qsort(sortedindices, 100, sizeof(double), uf->compar_dbl_asc);
}
但是,行qsort(sortedindices, 100, sizeof(double), uf->compar_dbl_asc);
会抛出以下编译时错误:
error C3867: 'USEFUL_FUNCTIONS::compar_dbl_asc': non-standard syntax; use '&' to create a pointer to member
我尝试过&uf->compar_dbl_asc
,但这会产生错误:
error C2276: '&': illegal operation on bound member function expression
任何有助于解决此问题的方法都表示赞赏。
答案 0 :(得分:2)
正如编译器在错误消息中明确指出的那样,uf->compar_dbl_asc
和&(uf->compar_dbl_asc)
都不适合用作qsort
的参数。
您可以使用compar_dbl_asc
作为qsort
的参数,使用以下方法之一。
compar_dbl_asc
成为该类的static
成员函数。namespace
并在compar_dbl_asc
中定义namespace
。 UF
可能是namespace
,除非出于某些其他原因必须是一个类。另一种选择是放弃使用qsort
来支持std::sort
。后者为您提供更多选择。使用std::sort
时,您可以使用仿函数或lambda函数,这样您就可以使用UF::compar_dbl_asc
。
std::sort(sortedindices, sortedindices+100,
[=uf](int a, int b) { return uf->compar_dbl_asc(a, b); });
需要注意的一点是,如果您选择最后一种方法,UF::compar_dbl_asc
的签名可以更改为更加用户友好的变体。
bool UF::compar_dbl_asc(int a, int b)
return (base_arr_dbl[a] < base_arr_dbl[b]);
}