While trying to port some C code to a C++ implementation, I ran into this problem. The module this came out of was designed to “automate data handling used to free and allocate memory as needed.” When compiling the legacy code in VC++ (it was compilable with WATCOM C/C++ 11.0), I got a function pointer for allocs from a memory management module that looks like this:
void *(*gAlloc)(size_t size);
It generates this error:
- i:sponlinesrcmdc.cpp(18) : error C2040: ‘gAlloc’ : ‘void *(*)(unsigned int)’ differs in levels of indirection from ‘void (*)(unsigned int)’
I understand the “size_t” attribute is out of string.h, but I’ve never run into a case of “levels of indirection.” Does this mean that in C++ you can’t have “void *(*…”?
The size_t parameter is not the problem. Rather, it seems like the function pointer you’re passing doesn’t match the expected type. gAlloc is a pointer to a function that takes size_t and returns void*, whereas the expected type is a pointer to function that takes size_t and returns void. In other words, the return types, void and void*, don’t match.
You should check the declaration of the function that takes gAlloc and see what the expected pointer type is.