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