Двустороннее включение классов и экземпляров шаблона - PullRequest
0 голосов
/ 23 июня 2010

У меня возникла проблема при попытке скомпилировать эти два класса (армейский и общий) в свои собственные заголовочные файлы:

#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

Я попытался переслатьобъявляя WarriorGeneral в Army.h, но, похоже, он не работает, возможно, потому что это экземпляр шаблона?Во всяком случае, ошибки, которые я получаю с вышеприведенной версией, - это несколько подобных проблем и связанных с ними проблем:

Army.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Они даже не являются неразрешенными проблемами с компоновщиком ... Примечание.General.h файл.Я не знаю, правильно ли это.Что-нибудь можно сделать, чтобы сделать эту работу?

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 23 июня 2010

Я не могу сказать, что такое Army.h строка 21, потому что та, которую вы разместили, не имеет такого количества строк. Единственное, что я вижу, это не объявлено в этом заголовке, это UnitList. Это правильно объявлено заранее или заголовок включает в себя, что вы не показываете нам?

Включают ли generalbase.h или Warrior.h Army.h? Если так, то это вызвало бы, казалось бы, круговые включения. Попробуйте сделать так, чтобы он не включал, а вместо этого объявлял Army.

0 голосов
/ 23 июня 2010

Да, @ Марк Б. все правильно сделал! Я удалил Army.h из GeneralBase.h, и теперь он отлично компилируется. Однако я удивляюсь, что произойдет, если мне нужно будет включить Army.h в GeneralBase ...

0 голосов
/ 23 июня 2010

С этим кодом (как вырезанным, так и вставленным в один и тот же файл cpp с общим битом, где находится #include), при использовании 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 по ошибке и не включаете его?

0 голосов
/ 23 июня 2010

Вы можете «объявить вперед» шаблон с помощью

template <class T> class General;
...