Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

I want to sort an array of structures using templatized qsort

I have an array containing pointers to objects. Each object has a data member called name of type string.

I want to sort it using the templatized qsort function. Note again that each element in the array is a pointer to an object.
However, I get the error:

error C2227: left of '->name' must point to class/struct/union/generic type

at this line:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

return strcmp(a->name, b->name);

on compile time.

Why I get this error?

Here is the full code (I work with 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();
}
//----------------------------------------------------------------------

>Solution :

name is a c string. Is there any reason why you do not use c++ strings from stdlib ? You won’t be able to compile a code with a template ? Or std::sort ?

Anyway, the problem is that when you call the template, you define the type as a pointer. You end up with a pointer to pointer, which has no field "name".

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading