双向包含课程和模板实例

时间:2010-06-23 13:13:54

标签: c++ class inheritance templates typedef

尝试在自己的头文件中编译这两个类(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文件中。我不知道这是否正确。有什么办法可以做到这一点吗?

提前致谢!

4 个答案:

答案 0 :(得分:1)

我不知道第21行是什么Army.h因为你发布的那行没有那么多行。我能看到的唯一没有在标题中声明的是UnitList。它是正确地向前宣布还是有一个标题,包括你没有向我们展示?

generalbase.hWarrior.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)

是的,@ Mark B.做对了!我从GeneralBase.h中删除了Army.h,它现在编译得很完美。然而,这让我想知道如果我需要在GeneralBase中包含Army.h会发生什么......