【问题标题】:error: using typedef-name after class错误:在课后使用 typedef-name
【发布时间】:2010-09-22 18:58:26
【问题描述】:

我无法弄清楚这个的实际问题是什么。

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

class Actor
{
   ...
};

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

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

【问题讨论】:

  • 顺便说一句,typedef-struct 工件仅在 C 中使用,其中结构名称和其他类型的名称位于不同的命名空间中(不是 C++ 意义上的);在 C++ 中,结构和类名称可以“正常”使用,因此不需要 this C-typedef 习惯用法。
  • 我会冒昧地猜测您在错误消息中收到了那些 †字符,因为您使用的是 putty 并且需要设置“接收到的数据假定为在哪个字符集中”选项到 UTF-8。

标签: c++ class typedef


【解决方案1】:

您不能多次定义符号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

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

在 C/C++ 中,像这样的单一类错误会导致多个编译器错误是很常见的,而且更有用的消息通常不是第一个报告的。

【讨论】:

  • 您能详细说明一下吗?我对此还是有点陌生​​。
  • @Boco:简单地说,你试图创建两个不同的同名类型。
  • 谢谢你:)。最后删除 , Actor 似乎已经解决了这个问题。
  • 不过,我不明白你为什么要使用那个 typedef。
【解决方案2】:

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

struct _actor 
{ 
   ... 
};

typedef struct _actor _actor;
typedef struct _actor Actor; 

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

  _actor myActor;

而不是

 struct _actor myActor;

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

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

现在,在最初的 C 代码中,作者似乎打算将 struct _actor 仅用作实现细节,并且您将始终只使用 Actor 来引用此结构的实例。因此,在您的 C++ 代码中,您可能应该完全消除 typedef,而只需重命名结构。但是,这会给你:

 struct Actor {.....}
 class  Actor {.....}

所以,也许你应该考虑合并这两个类。

【讨论】:

    【解决方案3】:

    对于 arduino hectop 3d 打印机:

    将SdBaseFile.h 和SdBaseFile.cpp 中的fpos_t 变量重命名为fpos_t1 等另一个名称并重新编译。

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2012-11-20
      相关资源
      最近更新 更多