尝试在自己的头文件中编译这两个类(Army和General)时遇到问题:
#ifndef ARMY_H
#define ARMY_H
#include "definitions.h"
#include "UnitBase.h"
#include "UnitList.h"
#include "General.h"
class Army
{
public:
Army(UnitList& list);
~Army(void);
UnitBase& operator[](const ushort offset);
const UnitBase& operator[](const ushort offset) const;
const uint getNumFightUnits() const;
const ushort getNumUnits() const;
const General<Warrior>* getWarrior() const;
private:
UnitBase** itsUnits;
uint itsNumFightUnits;
ushort itsNumUnits;
WarriorGeneral* itsGeneral;
};
#endif
和
#ifndef GENERAL_H
#define GENERAL_H
#include "generalbase.h"
#include "Warrior.h"
class Army;
template <class T>
class General : public GeneralBase, public T
{
public:
General(void);
~General(void);
void setArmy(Army& army);
const Army& getArmy() const;
private:
Army* itsArmy;
};
typedef General<Warrior> WarriorGeneral;
#endif
我已尝试在Army.h中声明WarriorGeneral,但它似乎不起作用,也许是因为它是一个模板实例?无论如何,我在上面的版本中遇到的错误是这类和相关问题中的几个:
Army.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
它们甚至不是未解决的链接器问题...注意我将WarriorGeneral的typedef放在General.h文件中。我不知道这是否正确。有什么办法可以做到这一点吗?
提前致谢!
答案 0 :(得分:1)
我不知道第21行是什么Army.h
因为你发布的那行没有那么多行。我能看到的唯一没有在标题中声明的是UnitList
。它是正确地向前宣布还是有一个标题,包括你没有向我们展示?
generalbase.h
或Warrior.h
是否包含Army.h
?如果是这样,那将导致看似圆形的包含。尝试不做包含但转发声明Army
。
答案 1 :(得分:0)
您可以使用
“转发声明”模板template <class T> class General;
答案 2 :(得分:0)
使用该代码(切换并粘贴到具有#include所在的通用位的同一cpp文件中)使用g ++没有错误,如果你有这三个定义而不是#include“generalbase”:
struct GeneralBase { };
struct Warrior;
struct UnitList;
没有GeneralBase:
src/Army.cpp:13: error: expected class-name before ‘,’ token
没有战士:
src/Army.cpp:26: error: ‘Warrior’ was not declared in this scope
src/Army.cpp:26: error: template argument 1 is invalid
src/Army.cpp:26: error: invalid type in declaration before ‘;’ token
没有UnitList
src/Army.cpp:32: error: expected ‘)’ before ‘&’ token
所以有点难以看出你的错误是什么;也许你错误地定义了GENERAL_H并且不包含它?
答案 3 :(得分:0)