2011-11-15 25 views
5

Таким образом, я получаю следующие ошибки:проблемы пространств имен

..\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; 

Здесь находятся соответствующие файлы:

Actor.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_ */ 

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

ответ

12

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


С комментариями Op, вот то, что должно быть сделано:

class Actor; 

class Attack 
{ 

}; 

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

+0

Если я делаю это я получаю сообщение об ошибке:».. \ Actor.h: 26: ошибка: опережающее объявление о' STRUCT RadiantFlux :: Attack» – cactusbin

+0

Я не думаю, что параметр шаблона может быть объявлением вперед? Я думаю, что Актер должен быть объявлен в атаке вместо этого. Но, вернее, я думаю, что, возможно, есть другой способ разработки, чтобы зависимости были линейными, а не циклическими. – Kevin

+0

@cactusbin: вам нужно переслать-объявить 'Actor' для' Attack', а не наоборот (зачем вам нужна эта зависимость?). –

0

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

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

class Attack; 

class Actor 
{ 
    ... 
}; 
+2

Нет, вы не может перенаправлять объявление Attack, потому что 'std :: vector' не может быть создан с неполным типом. –

Смежные вопросы