64,636
社区成员
发帖
与我相关
我的任务
分享
template<class TT> double Fabs(TT aa) {return (double)abs(aa);}
template<> double Fabs(double aa) {return fabs(aa);}
template<> double Fabs(long aa) {return (double)labs(aa);}
template<class TT> int (*Cmp)(const void* aa,const void* bb)
{
int *b;
*b=Fabs(*((const TT*)(aa)))-Fabs(*((const TT*)(bb)));
return b;
}
int Cmp(const void* aa,const void* bb)
{
int b;
b=(int)(Fabs(*((const int*)(aa)))-Fabs(*((const int*)(bb))));
return b;
}
template<class TT> double Fabs(TT aa) {return (double)abs(aa);}
template<> double Fabs<double>(double aa) {return fabs(aa);}
template<> double Fabs<long>(long aa) {return (double)labs(aa);}
template<class TT> int Cmp(const void* aa,const void* bb)
{
return (int)(Fabs(*static_cast<TT *>(const_cast<void *>(aa)))-Fabs(*static_cast<TT *>(const_cast<void *>(bb))));
}
1, 2, 3, 4, 6, 7, 9#include <iostream> #include <cstdlib> using namespace std; template<class T> int CmpFunc(const void *a, const void *b) { return *static_cast<T *>(const_cast<void *>(a)) - *static_cast<T *>(const_cast<void *>(b)); } int main() { int a[]{9, 3, 6, 2, 1, 4, 7}; qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), CmpFunc<int>); for(auto v : a){ cout << v << ", "; } cout << "\b\b " << endl; return 0; }
template<class TT> double Fabs(TT aa) {return (double)abs(aa);}
template<> double Fabs<double>(double aa) {return fabs(aa);}
template<> double Fabs<long>(long aa) {return (double)labs(aa);}
template<class TT> int Cmp(const void* aa,const void* bb)
{
return (int)(Fabs(*static_cast<TT *>(const_cast<void *>(aa)))-Fabs(*static_cast<TT *>(const_cast<void *>(bb))));
}
我改成以上代码后提示错误,错误信息如下,请给解答一下,我用的是vc6.0
E:\VCFile\Mat\Mat.cpp(818) : error C2664: 'qsort' : cannot convert parameter 4 from 'int (const void *,const void *)' to 'int (__cdecl *)(const void *,const void *)'
None of the functions with this name in scope match the target type
c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function 'class mat<class std::complex<double> > &__thiscall mat<class std::complex<double> >::SetTAD(const class mat<class std::comple
x<double> > &)'
执行 cl.exe 时出错.
这个还真没试过,不过你那个模板函数是不是有点问题 定义指针不调用new吗,还有最后那个return b 是想返回什么东西
int Cmp(const void* aa,const void* bb)
{
int b;
b=(int)(Fabs(*((const double*)(aa)))-Fabs(*((const double*)(bb))));
return b;
}
#include <iostream>
#include <cstdlib>
using namespace std;
template<class T>
int CmpFunc(const void *a, const void *b)
{
return *static_cast<T *>(const_cast<void *>(a)) - *static_cast<T *>(const_cast<void *>(b));
}
int main()
{
int a[]{9, 3, 6, 2, 1, 4, 7};
qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), CmpFunc<int>);
for(auto v : a){
cout << v << ", ";
}
cout << "\b\b " << endl;
return 0;
}
1, 2, 3, 4, 6, 7, 9 我的程序中T可能为复数或双精度数,cmp要求返回整数.
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
template <class T>
int Cmp(const void* a,const void* b)
{
T* p1 = (T*)a;
T* p2 = (T*)b;
int x = (int)(*p1 - *p2);
return x;
}
int main()
{
//测试double类型数据
unsigned int uiSize = 10;
double* pdArr = new double[uiSize];
for (unsigned int i = 0; i != uiSize; ++i)
{
pdArr[i] = rand() % 50 * 3.14;
}
for (unsigned int i = 0; i != uiSize; ++i)
{
cout << pdArr[i] << ends;
}
cout << endl;
qsort(pdArr, uiSize, sizeof(double), Cmp<double>);
for (unsigned int i = 0; i != uiSize; ++i)
{
cout << pdArr[i] << ends;
}
cout << endl;
//测试float型数据
float* pfArr = new float[uiSize];
for (unsigned int i = 0; i != uiSize; ++i)
{
pfArr[i] = static_cast<float>(rand() % 50 * 2.17);
}
for (unsigned int i = 0; i != uiSize; ++i)
{
cout << pfArr[i] << ends;
}
cout << endl;
qsort(pfArr, uiSize, sizeof(float), Cmp<float>);
for (unsigned int i = 0; i != uiSize; ++i)
{
cout << pfArr[i] << ends;
}
cout << endl;
//测试int型数据
int* piArr = new int[uiSize];
for (unsigned int i = 0; i != uiSize; ++i)
{
piArr[i] = rand() % 1000;
}
for (unsigned int i = 0; i != uiSize; ++i)
{
cout << piArr[i] << ends;
}
cout << endl;
qsort(piArr, uiSize, sizeof(int), Cmp<int>);
for (unsigned int i = 0; i != uiSize; ++i)
{
cout << piArr[i] << ends;
}
cout << endl;
delete []pfArr;
delete []pdArr;
delete []piArr;
return 0;
}
[quote=引用 3 楼 qq_33462307 的回复:] 这个还真没试过,不过你那个模板函数是不是有点问题 定义指针不调用new吗,还有最后那个return b 是想返回什么东西
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
template <class T>
T Cmp(const void* a,const void* b)
{
return *((T*)(a)) - *((T*)(b));
}
int main()
{
unsigned int iSize = 10;
int* piArr = new int[iSize];
for (unsigned int i = 0; i != iSize; ++i)
{
piArr[i] = rand() % 50;
}
for (unsigned int i = 0; i != iSize; ++i)
{
cout << piArr[i] << ends;
}
cout << endl;
qsort(piArr, iSize, sizeof(int), Cmp<int>);
for (unsigned int i = 0; i != iSize; ++i)
{
cout << piArr[i] << ends;
}
cout << endl;
return 0;
}