【问题标题】:Error: 'xxx' is not a type [duplicate]错误:“xxx”不是类型[重复]
【发布时间】:2016-10-28 21:15:28
【问题描述】:

在这个完整的代码中:

class foo
{
  public:
    foo(const int pin);
};

class bar {
  public:
    // Constructor
    bar(const int dataPin) : dataPin_ (dataPin) { }

  private:
    const int dataPin_;
    foo myFoo_ (dataPin_);  // instance of foo
};

int main (void)
  {
  return 0;
  }

使用 g++ 4.8.4 我得到错误:

g++ -Wall -c "test.cpp" (in directory: /home/nick/Development)
test.cpp:14:17: error: ‘dataPin_’ is not a type
     foo myFoo_ (dataPin_);  // instance of foo
                 ^
Compilation failed.

使用 clang 3.4-1ubuntu3 我得到:

test.cpp:14:17: error: unknown type name 'dataPin_'
    foo myFoo_ (dataPin_);  // instance of foo
                ^
1 error generated.

为什么这里需要一个类型?这是试图创建foo 的实例作为bar 的类变量。变量dataPin_ 直接在上面声明。


如果我将错误所在的行改成这个,它会编译干净:

    foo myFoo_ (int dataPin_);  // instance of foo

【问题讨论】:

  • 你必须像类的任何其他成员一样在bar()构造函数中初始化myFoo_
  • 即使您打开 C++11,仍然不允许使用括号进行类内数据成员初始化(与大括号或 = 相反)。
  • foo myFoo_ (dataPin_); // foo 的实例。那应该是函数还是变量?
  • 该行应该是一个变量——foo 的一个实例。
  • 我个人认为这不是重复的。我没有询问类内初始化程序,当我搜索该错误消息时,肯定没有出现“重复”问题。

标签: c++ compiler-errors


【解决方案1】:

它将foo myFoo_ (dataPin_); 读取为函数声明:myFoo_ 是一个接受dataPin_ 并返回foo 的函数。这就是为什么它在 ( ) 中期待一个类型名称。

要解决此问题,请在构造函数中初始化 myFoo_,就像使用 dataPin_ 一样:

bar(const int dataPin) : dataPin_ (dataPin), myFoo_(dataPin) {}

【讨论】:

  • 好的,我现在看到了。我使用的“修复”只是将这条线变成了一个函数原型。你建议编译好的 - 以及将错误行更改为仅:foo myFoo_;
【解决方案2】:

这里你应该添加类型而不是变量,这是函数签名,它应该有类型而不是变量。

foo myFoo_ (dataPin_);  // instance of foo

【讨论】:

  • “在这里你应该添加类型而不是变量”并没有回答“为什么这里需要一个类型?”的问题,它只是重复了编译器所说的内容。
  • 我正在编辑它以解释更多信息,然后我看到了你的答案,所以我留下了它,因为我要和你说的一样:)。 @melpomene
猜你喜欢
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多