错误:上课后使用typedef-name

Boc*_*oco 4 c++ typedef class

我不知道这是什么实际问题。

typedef struct _actor
{
   ...
} _actor, Actor;

class Actor
{
   ...
};
Run Code Online (Sandbox Code Playgroud)

我收到这个奇怪的错误消息actor.cpp:31: error: using typedef-name ‘Actor’ after ‘class’

知道我在这里做错了什么吗?谢谢 :)

Ric*_*ook 5

不允许Actor多次定义符号。该typedef语句已经将符号定义Actor为别名,struct _actor然后再尝试声明具有相同名称的类。

我猜您正在使用gcc编译器。当我编译时,出现以下错误gcc

../src/main.cpp:113: error: using typedef-name ‘Actor’ after ‘class’
../src/main.cpp:111: error: ‘Actor’ has a previous declaration here
Run Code Online (Sandbox Code Playgroud)

第一条消息(指向class Actor的程序行)指出,你不能声明一个类typedef-nameActor使用已声明typedef)。第二条消息(指向typedef struct _actor程序中的行)更加清晰,并指向的多个声明Actor

在C / C ++中,像这样的一类错误会导致多个编译器错误,这是很常见的,而且更有用的消息通常没有首先得到报道。

  • @Boco:简而言之,您正在尝试创建两个具有相同名称的不同类型。 (2认同)

Jam*_*ran 5

为了理解发生了什么,我们需要将第一个语句分成几个部分:

struct _actor 
{ 
   ... 
};

typedef struct _actor _actor;
typedef struct _actor Actor; 
Run Code Online (Sandbox Code Playgroud)

首先我们创建一个名为 的结构_actorstruct _actor接下来,我们为调用创建一个 typedef _actor。这仅在 C 中有用。它允许我们说:

  _actor myActor;
Run Code Online (Sandbox Code Playgroud)

代替

 struct _actor myActor;
Run Code Online (Sandbox Code Playgroud)

但在 C++ 中,这是不必要的,因为 C++ 允许我们本地使用第一种形式,而不需要 typedef。

第三行为被struct _actor调用的创建第二个typedef Actor。当您尝试创建一个名为的类时Actor,编译器会抱怨,因为该名称已被用作该结构的别名。

现在,在原始的 C 代码中,作者似乎struct _actor只想提供一个实现细节,并且您将始终使用它Actor来引用此结构的实例。因此,在您的 C++ 代码中,您可能应该完全消除 typedef,而只重命名该结构。然而,这会给你:

 struct Actor {.....}
 class  Actor {.....}
Run Code Online (Sandbox Code Playgroud)

因此,您应该考虑合并这两个类。