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關鍵字的一種特別使用情況


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM