Проблемы с пространством имен - PullRequest
5 голосов
/ 15 ноября 2011

Итак, я получаю следующие ошибки:

..\Actor.h:35: error: `Attack' is not a member of `RadiantFlux'
..\Actor.h:35: error: template argument 1 is invalid
..\Actor.h:35: error: template argument 2 is invalid
..\Actor.h:35: error: ISO C++ forbids declaration of `attacks' with no type

В этой строке (среди прочих):

std::vector<RadiantFlux::Attack> attacks;

Вот соответствующие файлы:

Актер.h:

#ifndef ACTOR_H_
#define ACTOR_H_

#include <string>
#include <vector>
#include "Attack.h"

namespace RadiantFlux {

...

class Actor {
private:
    std::string name;
    int health;
    std::vector<RadiantFlux::Attack> attacks;
    Attributes attributes;

public:
    ...
};

}

#endif /* ACTOR_H_ */

Attack.h:

#ifndef ATTACK_H_
#define ATTACK_H_

#include <string>
#include <stdlib.h>
#include <time.h>
#include "Actor.h"

namespace RadiantFlux {

... 

class Attack {
private:
    ...

public:
    ...
};

}

#endif /* ATTACK_H_ */

Почему я получаю эти ошибки и что я могу сделать, чтобы их исправить?Я предполагаю, что это как-то связано с пространствами имен ...

Ответы [ 2 ]

12 голосов
/ 15 ноября 2011

У вас есть циклическая зависимость ваших заголовочных файлов.
Attack.h включает Actor.h и наоборот.
Используйте Форвардное объявление класса, чтобы избежать проблем круговой зависимости.


Поскольку комментарии ОП, вот что нужно сделать:

class Actor;

class Attack
{

};

Если ваш код не скомпилируется после этого, вам необходимо прочитать связанный ответ и Понять , почему возникла ошибка и как ее устранить. Связанный ответ объясняет все это.

0 голосов
/ 15 ноября 2011

Классы Actor и Attack оба ссылаются друг на друга, поэтому вам потребуется добавить предварительную декларацию в один из файлов.

Например, в Actor.h:

class Attack;

class Actor
{
    ...
};
...