非类typedef的c ++前向声明

时间:2012-01-06 13:09:49

标签: c++ typedef forward-declaration

我有这个:

//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..
}

如何以与void *?

兼容的方式转发声明Foo

这是一个过于简单的例子,当然这里很简单,但想法是有多个实现,如下所示:

//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 个答案:

答案 0 :(得分:1)

为什么不能在之前输入typedef。如果声明函数具有给定自定义类型的参数(可以是class或typedef),则还需要以某种方式声明此类。

与指向类/结构的指针一样,即使类成员未知(= sizeof(指针)),大小也是众所周知的,如果是typedef类型,除非你不知道大小提供完整的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不是一个好主意。

答案 1 :(得分:0)

typedef void* Foo;

void doSome(Foo foo);

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

您只需要向前声明具有实现的类。 Typedef没有实现。