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


    开发环境: 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关键字的一种特别使用情况

  • 相关阅读:
    LINQ篇:ASP.NET using LINQ(Part One) Scott大师的产物
    运算符重载 operator+[纯属温习啊][附加了一些内容 如:同名属性,复制构造函数]
    Vista中低端电脑如何打开Aero效果或者就是3D效果
    基于可配置化的设计[原创][4.20更新]
    Treeview控件如何在asp.net ajax中使用小技巧
    PetShop 4.0 系列之四 [转]
    XML篇查询语言XPath
    抽象工厂模式[转]
    何时使用委托而不使用接口
    DNN开篇第一话
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11165861.html
Copyright © 2020-2023  润新知