Почему вы не можете поставить typedef раньше. Если вы объявляете функцию, имеющую аргумент заданного пользовательского типа (будь то class или typedef), вам также необходимо как-то объявить этот класс.
Как и в случае указателей на класс / структуру, размер прекрасно известен, даже если член класса неизвестен (= sizeof (указатель)), в случае типов с определением типа, размер не может быть известен, пока вы предоставьте полную декларацию typedef.
Поэтому решение состоит в том, чтобы поместить typedef
перед объявлением вашей функции.
Вы должны иметь:
// declarations
typedef void* Foo; //Foo is defined later as void*
void doSome(Foo foo);
// definitions
void doSome(Foo foo)
{
//code here..
}
Если по какой-то причине вы не можете изменить определения, вы можете повторить typedef дважды (если оба они не конфликтуют / абсолютно одинаковы):
// declarations
typedef void* Foo;
void doSome(Foo foo);
// definitions
typedef void* Foo;
void doSome(Foo foo)
{
//code here..
}
ИЗМЕНИТЬ после редактирования вопроса
Лучше всего было бы иметь перегруженные функции:
void doSome(void* foo)
{
// void* version
}
void doSome(int* foo)
{
// int* version
}
Не стоит иметь разные Foo
в вашем проекте.