开发环境: Qt Creator 4.8.2

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

  1. error: must use class tag to refer to type XXX in this scope

出错的代码部分如下:

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

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

  1. Iterator* ConcreteAggregate::ConcreteIteratorDesc()
  2. {
  3. // return new ConcreteIteratorDesc(this);
  4. return new class ConcreteIteratorDesc(this);
  5. }

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

  1. class Aggregate
  2. {
  3. public:
  4. virtual Iterator* CreateIterator() = 0;
  5. virtual Iterator* ConcreteIteratorDesc() = 0;
  6. virtual vector<object>* GetVector() = 0;
  7. };
  8. //定义一个具体的聚合类
  9. class ConcreteAggregate : public Aggregate
  10. {
  11. public:
  12. ConcreteAggregate();
  13. ~ConcreteAggregate();
  14. Iterator* CreateIterator() override;
  15. Iterator* ConcreteIteratorDesc() override;
  16. int GetCount() const;
  17. vector<object>* GetVector() override;
  18. object GetElement(int index);
  19. private:
  20. vector<object>* items;
  21. };

然后又定义了一个类

  1. //实现从前向后的迭代器
  2. class ConcreteIterator : public Iterator
  3. {
  4. public:
  5. //初始化时将具体的聚合对象传入
  6. ConcreteIterator(Aggregate* aggregate);
  7. object First() override;
  8. object Next() override;
  9. object CurrentItem() override;
  10. bool IsDone() override;
  11. private:
  12. ConcreteAggregate* m_aggregate; //定义了一个具体聚集对象
  13. int current;
  14. };

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

  1. virtual Iterator* ConcreteIteratorDesc() = 0;

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

  1. Iterator* ConcreteAggregate::ConcreteIteratorDesc()
  2. {
  3. return new ConcreteIteratorDesc(this);
  4. // return new class ConcreteIteratorDesc(this);
  5. }

解决方案:

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

参考资料:

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. TestingWhiz社区版2013版下载地址

    TestingWhiz社区版 https://sourceforge.net/projects/testingwhiz-community-edition/ https://sourceforge.n ...

  2. pc显示,手机隐藏

    <div class="none"><img src="https://www.foresthouse.cn/bigpic.jpg"/> ...

  3. Exchanger 源码分析

    Exchanger 此类提供对外的操作是同步的: 用于成对出现的线程之间交换数据[主场景]: 可以视作双向的同步队列: 可应用于基因算法.流水线设计.数据校对等场景 创建实例 /** * arena ...

  4. JS-Array.prototype 中的方法的坑

    fill() 今天刷 HackerRank 的题遇到需要创建链表数组(一维数组的每一项是个链表)的题. 众所周知 JS 中的数组可以当链表用,我就用如下代码进行创建 let seqs = (new A ...

  5. .Net Core 使用 System.Drawing.Common 在CentOS下报错

    .Net Core控制台项目,添加了 System.Drawing.Common 引用 #locate libdl /usr/lib64/libdl-2.17.so /usr/lib64/libdl. ...

  6. request.getParameter() 和request.getAttribute()

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wrs120/article/details/79287607[相同点] 1.都是HttpServle ...

  7. lombok 简化 get set toString hash equals等方法

    1.lombok 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. 2.安装 下载 https://projectlombok.or ...

  8. winCE 获取路径信息

    最近在做一个SAP的winCE扫描枪项目,采用C#开发,不过在获取路径是采用了常用的System.IO.Directory.GetCurrentDirectory, 并不能使用:查询后了解到winCE ...

  9. sublime text3插件安装及使用

    sublime官网下载地址:http://www.sublimetext.com/ 我用的是SubLime text3,插件安装命令地址:https://packagecontrol.io/insta ...

  10. Balanced Lineup poj3264 线段树

    Balanced Lineup poj3264 线段树 题意 一串数,求出某个区间的最大值和最小值之间的差 解题思路 使用线段树,来维护最大值和最小值,使用两个查询函数,一个查区间最大值,一个查区间最 ...