【问题标题】:Expected unqualified-id before 'double'/'double' 之前的预期不合格 ID/
【发布时间】:2012-09-25 01:00:24
【问题描述】:

我正在为一个名为 Robot 的实验室编写程序。当我编译它时,我得到了这组错误:

Robot.cpp:43:13: 错误: 'double' 之前的预期 unqualified-id

Robot.cpp:43:13: 错误:在 'double' 之前需要 ')'

该类在 Robot.h 标头中定义,导致问题的 .cpp 中的代码如下所示:

/*
 * Name: Robot (constructor)
 *
 * Creates the robot with the given maximum speed.
 */

 Robot( double maxSpd ) 

 {

      MAX_SPEED = maxSpd;
      traveled = 0 ;
      elapsed = 0 ;
      x = 0 ;
      y = 0 ;

 }

我不知道为什么会出现这些错误……而且我也不知道那个错误是什么意思。我该如何解决?

【问题讨论】:

  • 这似乎不是有效的 C++。为什么maxSpd )后面有分号?
  • 这是在你的类定义中,还是在它之外?
  • 另外,您能给我们提供更多背景信息吗?如果它是在一个类的上下文中,这可能很好,但我感觉你的范围已经关闭了。
  • 另外,MAX_SPEED 是不变的吗?如果你正在初始化它,你需要一个初始化器,但你也应该把其他的也放在那里。
  • @FoolishOrpheus:顺便说一句,最好避免使用像“MAX_SPEED”这样的全大写标识符。预处理器宏名称大写是非常普遍的做法,这是避免在其他任何地方使用大写标识符的一个重要原因:您不想找到包含定义 MAX_SPEED 的某些标头并且您的代码突然中断。混合或小写都可以。

标签: c++ g++


【解决方案1】:

我已经设法重现您的错误。

首先,签名后的分号必须去掉。当您尝试定义一个函数时,它正在声明一个函数。

Robot(double maxSpd) {...} //没有分号

其次首先,由于这是在你的类之外,你需要限定它:

Robot::Robot(double maxSpd) {...}

接下来,由于MAX_SPEED是一个常量,你需要把它放在一个成员初始化器中:

Robot::Robot(double maxSpd)
    : MAX_SPEED(maxSpd) {...}

最后,您也应该将其余的赋值移到初始化列表中(不是必须的,但这样做很好),记住它们应该按照声明的顺序列出在类定义中:

Robot::Robot(double maxSpd)
    : MAX_SPEED(maxSpd), traveled(0), elapsed(0), x(0), y(0) {
//body, which, from your example, would now be empty
}

【讨论】:

  • 在您发布答案后,OP 删除了签名后的分号(以及相应的错误消息)。
  • @chris 嘿,我在这里学习 C++,我有一个问题。如果我在类声明中定义构造函数,我不需要添加 Robot::Robot,对吗?
  • @Ken,你是对的。在外部,它需要它,因为它不再在Robot 的范围内,所以它需要Robot:: 才能获得正确的范围。 :: 称为范围解析运算符。如果这是另一个函数而你忘记了它,它所要做的就是定义一个与你的类无关的随机函数。如果你然后尝试在你的类中使用它,你会得到一个链接器错误,因为它是声明的,但没有定义。但是,由于这是构造函数,因此没有返回类型会导致编译器错误。
【解决方案2】:

可能的问题是左括号前有一个分号。但是如果没有看到全班,就很难这么说。

如果此代码不在类声明中,您可能在“Robot()”构造函数名称之前缺少“Robot::”命名空间规范。

例子:

Robot::Robot(double maxSpd)
{
   MAX_SPEED = maxSpd;
   traveled = 0;
   elapsed = 0;
   x = 0;
   y = 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多