错误消息:嵌套名称说明符中的类型不完整
error message: Incomplete type in nested name specifier
我知道有很多类似的命名问题,但是在阅读了很多之后我还是无法弄清楚我的问题。
我正在为 class 项目编写游戏。
在 class Dungeon
中,function monsterTurn()
需要访问在 class Hero
中声明为受保护的 setCurrSp()
。因此,我尝试将monsterTurn()
作为友元函数添加到Hero
。因为我在 class Dungeon
中有 #include "Hero.hpp"
,所以我使用了前向声明,但是它抛出了一个错误 Incomplete type 'Dungeon' named in nested name specifier
.
我知道声明 setCurrSp()
为 public 会解决所有这些问题,但我不想留下 setter public。似乎为意外修改留了一个后门。如果我错了,请纠正我。
部分代码如下
Hero.hpp
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <vector>
#include "Entity.hpp"
class Dungeon;
class Hero : public Entity{
protected:
void setCurrSp(int currSp) { this->currSp = currSp;}
public:
friend void Dungeon::monstersTurn(vector<Hero>::iterator hero, vector<Hero> heros);
}
Dungeon.hpp
#include <stdio.h>
#include <vector>
#include "Hero.hpp"
#include "Monster.hpp"
class Dungeon{
public:
void monstersTurn(vector<Hero>::iterator hero, vector<Hero> heroes);
}
任何帮助将不胜感激。
对于friend
声明
friend void Dungeon::monstersTurn(vector<Hero>::iterator hero, vector<Hero> heros);
前向声明
class Dungeon;
不够。
演示:
class Dungeon; // forward declaration
class Hero {
friend void Dungeon::takeHero(Hero&);
};
class Dungeon {
public:
void take(Hero&);
};
输出:
main.cpp:5:38: error: invalid use of incomplete type 'class Dungeon'
4 | friend void Dungeon::takeHero(Hero&);
| ^
main.cpp:1:7: note: forward declaration of 'class Dungeon'
1 | class Dungeon; // forward declaration
| ^~~~~~~
class Hero
需要 class Dungeon
到 "know" 其成员的完整声明。
对于 friend class
声明,前向声明 就足够了:
class Dungeon; // forward declaration
class Hero {
friend class Dungeon;
};
class Dungeon {
public:
void take(Hero&);
};
输出:
(none) – 编译无怨言
我知道有很多类似的命名问题,但是在阅读了很多之后我还是无法弄清楚我的问题。
我正在为 class 项目编写游戏。
在 class Dungeon
中,function monsterTurn()
需要访问在 class Hero
中声明为受保护的 setCurrSp()
。因此,我尝试将monsterTurn()
作为友元函数添加到Hero
。因为我在 class Dungeon
中有 #include "Hero.hpp"
,所以我使用了前向声明,但是它抛出了一个错误 Incomplete type 'Dungeon' named in nested name specifier
.
我知道声明 setCurrSp()
为 public 会解决所有这些问题,但我不想留下 setter public。似乎为意外修改留了一个后门。如果我错了,请纠正我。
部分代码如下
Hero.hpp
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <vector>
#include "Entity.hpp"
class Dungeon;
class Hero : public Entity{
protected:
void setCurrSp(int currSp) { this->currSp = currSp;}
public:
friend void Dungeon::monstersTurn(vector<Hero>::iterator hero, vector<Hero> heros);
}
Dungeon.hpp
#include <stdio.h>
#include <vector>
#include "Hero.hpp"
#include "Monster.hpp"
class Dungeon{
public:
void monstersTurn(vector<Hero>::iterator hero, vector<Hero> heroes);
}
任何帮助将不胜感激。
对于friend
声明
friend void Dungeon::monstersTurn(vector<Hero>::iterator hero, vector<Hero> heros);
前向声明
class Dungeon;
不够。
演示:
class Dungeon; // forward declaration
class Hero {
friend void Dungeon::takeHero(Hero&);
};
class Dungeon {
public:
void take(Hero&);
};
输出:
main.cpp:5:38: error: invalid use of incomplete type 'class Dungeon'
4 | friend void Dungeon::takeHero(Hero&);
| ^
main.cpp:1:7: note: forward declaration of 'class Dungeon'
1 | class Dungeon; // forward declaration
| ^~~~~~~
class Hero
需要 class Dungeon
到 "know" 其成员的完整声明。
对于 friend class
声明,前向声明 就足够了:
class Dungeon; // forward declaration
class Hero {
friend class Dungeon;
};
class Dungeon {
public:
void take(Hero&);
};
输出:
(none) – 编译无怨言