прямое объявление c ++ для неклассовой typedef - PullRequest
2 голосов
/ 06 января 2012

У меня есть это:

//forward declaration of Foo <-- this is my question
void doSome(Foo foo);

typedef void* Foo; //Foo is defined later as void*

void doSome(Foo foo)
{
   //code here..
}

Как переслать объявление Foo способом, совместимым с void *?

Это упрощенный пример, конечно, здесь тривиальный, ноИдея состоит в том, чтобы иметь несколько реализаций, например:

//forward declaration of Foo <-- this is my question
void doSome(Foo foo);

//[implementation1_internal.h]
typedef void* Foo; //Foo is defined later as void*

void doSome(Foo foo)
{
   //code here..
}

//[implementation2_internal.h]
typedef int* Foo; //Foo is defined later as int*

void doSome(Foo foo)
{
   //code here..
}

и выбрать одну из них, используя директивы препроцессора.(Это не имеет значения, просто показывать пример не просто глупо).

Ответы [ 2 ]

1 голос
/ 06 января 2012

Почему вы не можете поставить 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 в вашем проекте.

0 голосов
/ 06 января 2012
typedef void* Foo;

void doSome(Foo foo);

void doSome(Foo foo)
{
   //code here..
}

Вам нужно только заранее объявить классы, которые имеют реализации.У typedefs нет реализаций.

...