我想使用模板化 qsort 对结构数组进行排序
I want to sort an array of structures using templatized qsort
我有一个包含对象指针的数组。每个对象都有一个名为 name 的数据成员,类型为 string.
我想使用模板化的 qsort 函数对其进行排序。再次注意,数组中的每个元素都是指向对象的指针。
但是,我收到错误消息:
error C2227: left of '->name' must point to class/struct/union/generic type
在这一行:
return strcmp(a->name, b->name);
在编译时。
为什么会出现此错误?
这是完整代码(我使用 Visual Studio 2019):
#include <cstdlib>
#include <stdio.h>
#include <string.h>
//----------------------------------------------------------------------
class my_type {
public:
char name[10];
my_type(char* source) {
strcpy(name, source); // assume data are valid
}
};
//----------------------------------------------------------------------
template <typename a_type>
int compare(const void* pa, const void* pb)
{
a_type* a = (*(a_type**)pa);
a_type* b = (*(a_type**)pb);
return strcmp(a->name, b->name);
}
//----------------------------------------------------------------------
int main()
{
my_type**a;
int n = 5;
a = new my_type * [n]; // allocate the array.
for (int i = 0; i < n; i++) {
char buf[100];
_itoa(i, buf, 10);
a[i] = new my_type(buf); // allocate each element of the array.
}
qsort(a, n - 1, sizeof(a[0]), compare<my_type*>); // sort them
for (int i = 0; i < n; i++)// print the sorted elements
printf("%s ", a[i]->name);
for (int i = 0; i < n; i++)
delete a[i]; // delete each element
delete[] a; // delete array
getchar();
}
//----------------------------------------------------------------------
name 是一个 C 字符串。有什么理由不使用 stdlib 中的 c++ 字符串吗?您将无法使用模板编译代码?或者 std::sort ?
不管怎样,问题是你在调用模板的时候,把类型定义为指针。你最终得到一个指向指针的指针,它没有字段“name”。
我有一个包含对象指针的数组。每个对象都有一个名为 name 的数据成员,类型为 string.
我想使用模板化的 qsort 函数对其进行排序。再次注意,数组中的每个元素都是指向对象的指针。 但是,我收到错误消息:
error C2227: left of '->name' must point to class/struct/union/generic type
在这一行:
return strcmp(a->name, b->name);
在编译时。
为什么会出现此错误?
这是完整代码(我使用 Visual Studio 2019):
#include <cstdlib>
#include <stdio.h>
#include <string.h>
//----------------------------------------------------------------------
class my_type {
public:
char name[10];
my_type(char* source) {
strcpy(name, source); // assume data are valid
}
};
//----------------------------------------------------------------------
template <typename a_type>
int compare(const void* pa, const void* pb)
{
a_type* a = (*(a_type**)pa);
a_type* b = (*(a_type**)pb);
return strcmp(a->name, b->name);
}
//----------------------------------------------------------------------
int main()
{
my_type**a;
int n = 5;
a = new my_type * [n]; // allocate the array.
for (int i = 0; i < n; i++) {
char buf[100];
_itoa(i, buf, 10);
a[i] = new my_type(buf); // allocate each element of the array.
}
qsort(a, n - 1, sizeof(a[0]), compare<my_type*>); // sort them
for (int i = 0; i < n; i++)// print the sorted elements
printf("%s ", a[i]->name);
for (int i = 0; i < n; i++)
delete a[i]; // delete each element
delete[] a; // delete array
getchar();
}
//----------------------------------------------------------------------
name 是一个 C 字符串。有什么理由不使用 stdlib 中的 c++ 字符串吗?您将无法使用模板编译代码?或者 std::sort ?
不管怎样,问题是你在调用模板的时候,把类型定义为指针。你最终得到一个指向指针的指针,它没有字段“name”。