开发环境: Qt Creator 4.8.2

在写程序的时候,遇到了编译器报错

error: must use ‘class’ tag to refer to type ‘XXX’ in this scope

出错的代码部分如下:

Iterator* ConcreteAggregate::ConcreteIteratorDesc()
{
return new ConcreteIteratorDesc(this); //error: must use 'class' tag to refer to type 'ConcreteIteratorDesc' in this scope
}

根据提示,修改代码如下后,编译器错误消失

Iterator* ConcreteAggregate::ConcreteIteratorDesc()
{
// return new ConcreteIteratorDesc(this);
return new class ConcreteIteratorDesc(this);
}

经过排查,终于发现了这个错误的原因,首先定义了一个抽象类及其子类

class Aggregate
{
public:
virtual Iterator* CreateIterator() = 0;
virtual Iterator* ConcreteIteratorDesc() = 0;
virtual vector<object>* GetVector() = 0;
};
//定义一个具体的聚合类
class ConcreteAggregate : public Aggregate
{
public:
ConcreteAggregate();
~ConcreteAggregate();
Iterator* CreateIterator() override;
Iterator* ConcreteIteratorDesc() override;
int GetCount() const;
vector<object>* GetVector() override;
object GetElement(int index);
private:
vector<object>* items;
};

然后又定义了一个类

//实现从前向后的迭代器
class ConcreteIterator : public Iterator
{
public:
//初始化时将具体的聚合对象传入
ConcreteIterator(Aggregate* aggregate);
object First() override;
object Next() override;
object CurrentItem() override;
bool IsDone() override;
private:
ConcreteAggregate* m_aggregate; //定义了一个具体聚集对象
int current;
};

注意看可以发现,新定义的类名为ConcreteIterator,而Aggregate类中有同名的函数

   virtual Iterator* ConcreteIteratorDesc() = 0;

在实现子类ConcreteAggregate的ConcreteIteratorDesc()函数时,编译器报错

Iterator* ConcreteAggregate::ConcreteIteratorDesc()
{
return new ConcreteIteratorDesc(this);
// return new class ConcreteIteratorDesc(this);
}

解决方案:

  • 一种解决办法是在类前面加class,告诉编译器,调用关键字的位置是一个类
Iterator* ConcreteAggregate::ConcreteIteratorDesc()
{
return new class ConcreteIteratorDesc(this);
}
  • 另一种解决办法就是更换关键字

参考资料:

1 https://blog.csdn.net/fjjaylz/article/details/88744885 关于C++中class关键字的一种特别使用情况

error: must use ‘class’ tag to refer to type ‘XXX’ in this scope的更多相关文章

  1. ERROR 1045 (28000): Access denied for user xxx & ERROR 1449 (HY000): The user specified as a definer xxx does not exists

    今天在一个修改过权限的MySQL数据库遇到了"ERROR 1045 (28000): Access denied for user 'xxx'@'xxx.xxx.xxx.xxx' (usin ...

  2. ERROR 1526 (HY000): Table has no partition for value xxx

    最近,我们有些功能需要使用到基于多个字段的分区,需要同时支持oracle/mysql,但是开发人员又希望尽可能少的改动业务代码,也不愿意使用多列分区,在oracle 11g之前,不支持多列分区(12. ...

  3. Remote error: VAR and OUT arguments must match parameter type exactly'

    在XE10中 downloadfile(filename: string; out FileStream: TStream; out FileSize: int64)是没有问题的,升级到delphi ...

  4. 报错:OpenCV Error: Assertion failed (src.size() == dst.size() && src.type() == dst.ty pe()) in unknown function, file ..……

    在用cvDilate函数的时候,老是导致程序中断,报错如下: OpenCV Error: Assertion failed (src.size() == dst.size() && s ...

  5. linux下mysql启动 Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid)

    service mysql start 报错: Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid) ...

  6. MySQL数据库插入数据出现 ERROR 1526 (HY000): Table has no partition for value xxx

    MySQL数据库插入数据出现ERROR 1526 (HY000): Table has no partition for value xxx工作的时候发现无法插入数据,报错:ERROR 1526 (H ...

  7. org.apache.xmlbeans.XmlException: error: does not close tag

    使用myeclipse的jax自动生成webservice , 或者serviceImpl通过@webservice来实现webservice时, 使用soap UI (我测试使用的版本 5.2.1) ...

  8. 【c++错误】类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)

    今天编写类的程序的时候不小心把类后的分号忘写了,就出现上面的错误提示. 顺便复习下类的正确格式: class 类名 { public: //习惯上将公有类型放在前面,便于阅读 ……(外部接口) pro ...

  9. Activation error occured while trying to get instance of type Database,key ""之Oracle

    我在发布web项目时好几次好遇到这个问题,查看了别人的说法,感觉还是不能解决,后来发现在发布时bin里面有dll没有打包到发布文件的bin目录中,而这些dll又是在连接Oracle(我选择的Oracl ...

随机推荐

  1. 常用的HTML标记整理

    文章CSDN地址:https://blog.csdn.net/Ght1997... 文章GitHub地址:https://github.com/ght1997012...文章segmentfault地 ...

  2. clojure 语法

    Clojure 是一种运行在 Java 平台上的 LISP 方言,LISP 是一种以表达性和功能强大著称的编程语言. ; 分号作为注释的开始 ; clojure 用括号把元素括起来,元素之间用空格隔开 ...

  3. iView 实战系列教程(21课时)_2.iView 实战教程之导航、路由、鉴权篇

    在c盘创建一个iview-router的项目 . 然后使用默认的配置 跳过 添加vue-router的插件 编译我们的文件. 编译好之后,我们启动App 默认的页面就打开了. 默认两个路由一个是abo ...

  4. R语言中的几种数据结构

    R语言中的几种数据结构 一  R中对象的5种基本类型 字符(character) 整数 (integer) 复数(complex) 逻辑(logical:True/False) 数值(numeric: ...

  5. MM理论

    最初的MM理论,即由美国的Modigliani和Miller(简称MM)教授于1958年6月份发表于<美国经济评论>的“资本结构.公司财务与资本”一文中所阐述的基本思想.该理论认为,在不考 ...

  6. Java 基础-类与面向对象

    类 Object 类(java.lang.Object)是所有 Java 类的直接或间接父类. 成员方法及变长参数 方法定义: [public | protected | private] [stat ...

  7. 000 (H5*) 常见代码

    目录: 1:HTML 1:块级元素(block-level) 2:行内元素(inline-level) 3:行内块元素(inline-block) 4: img标签 5:表单元素 6:自定义列表  d ...

  8. JavaSE编码试题强化练习5

    1.不使用函数实现字符串的翻转 /** * 1.不使用函数实现字符串的翻转 */ public class TestStringReverse { public static void main(St ...

  9. FastDFS搭建单机图片服务器(二)

    防丢失转载:https://blog.csdn.net/MissEel/article/details/80856194 根据 分布式文件系统 - FastDFS 在 CentOS 下配置安装部署 和 ...

  10. git多账号配置,同时使用多个代码托管平台

    git多账号配置,同时使用多个代码托管平台:https://blog.csdn.net/pinnuli/article/details/81293071