【问题标题】:Getting Expected a type specifier error in c++在 C++ 中得到预期的类型说明符错误
【发布时间】:2019-09-25 22:43:14
【问题描述】:

我有一对基派生类(IND = MA 的基,MA = 派生自 INDST= ST1 的基,ST1 = 派生自 @ 987654328@) 和另一个班级 (FD)。我正在尝试像这样使用它们:

class ST1: public ST{


public:

FD f;

ST1(){};

ST1(FD& a) : f(a) {};

MA abc(f, 10);

};

我遇到的错误:

E0757   member "ST1::f" is not a type name
E0079   expected a type specifier
C2061   identifier 'f'  

所有错误都在MA abc(f, 10); 行。

请注意MA 没有默认构造函数,接受FD&, int 参数,IND 是一个纯虚类。

【问题讨论】:

  • MA abc(f, 10); 看起来像一个函数声明,你应该声明它的签名。类似MA abc(FD f, int i);
  • abc 应该是成员函数还是变量
  • @Someprogrammerdude 它应该是一个成员对象。

标签: c++


【解决方案1】:
MA abc(f, 10);

将编译器视为成员函数声明,因此出现错误消息 - 它期望 f10 是类型的名称。

对于内联成员变量的初始化,你必须使用花括号:

MA abc {f, 10};

但这对您没有多大用处,因为它会在您初始化它之前使用f
(行内初始化在任何构造函数初始化之前执行;您在类定义中编写它们的顺序无关紧要。)

将其初始化移动到初始化列表:

ST1() : abc(f,10) {}
ST1(FD& a) : f(a), abc(f,10) {};

并将声明保留为

MA abc;

【讨论】:

  • 我确实尝试了初始化列表方法,但就像我说的,MA 没有默认构造函数。我得到 MA 的默认构造函数被删除错误。
  • @hmmmmmm 如果你正在做构造函数初始化列表,你不应该得到它。
  • @Someprogrammerdude 我又试了一次,仍然收到the default constructor of "MA" cannot be referenced -- it is a deleted function 错误
  • @hmmmmmm 然后你在尝试的时候做错了。如果在初始化列表中初始化abc,则不需要默认构造函数。
  • @hmmmmmm 你的意思是,就像上面的答案一样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多