2011-11-15 34 views
5

Vì vậy, tôi nhận được các lỗi sau đây:vấn đề Namespace

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

On line này (trong số những người khác):

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

Dưới đây là các tập tin liên quan:

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

Tại sao tôi nhận được các lỗi này và tôi có thể làm gì để khắc phục chúng? Tôi cho rằng nó có liên quan đến các không gian tên ...

Trả lời

12

Bạn có một phụ thuộc tuần hoàn của các tệp tiêu đề của bạn.
Attack.h bao gồm Actor.h và ngược lại.
Sử dụng Forward Declaration của lớp học để tránh các vấn đề phụ thuộc vòng tròn.


Kể từ khi bình luận của OP, đây là những gì cần phải được thực hiện:

class Actor; 

class Attack 
{ 

}; 

Nếu mã của bạn thất bại trong việc biên dịch sau khi làm điều này, bạn cần phải đọc các câu trả lời liên quan và Hiểu tại sao và cách giải quyết nó. Câu trả lời được liên kết giải thích tất cả.

+0

Nếu tôi làm điều này tôi nhận được một lỗi:" .. \ Actor.h: 26: lỗi: tờ khai chuyển tiếp của' struct RadiantFlux :: Tấn công" – cactusbin

+0

Tôi không nghĩ rằng một tham số mẫu có thể là một tuyên bố chuyển tiếp có thể không? Tôi nghĩ rằng diễn viên nên được chuyển tiếp tuyên bố trong tấn công để thay thế. Nhưng thực sự, tôi nghĩ rằng có lẽ một cách khác nhau để thiết kế để các phụ thuộc là tuyến tính chứ không phải là cyclic. – Kevin

+0

@cactusbin: Bạn cần phải chuyển tiếp tuyên bố 'Diễn viên' cho 'Tấn công', chứ không phải ngược lại (tại sao bạn lại cần sự phụ thuộc này?). –

0

Các lớp học ActorAttack cả hai tham chiếu lẫn nhau, vì vậy bạn sẽ cần phải thêm khai báo chuyển tiếp vào một trong các tệp.

Ví dụ, trong Actor.h:

class Attack; 

class Actor 
{ 
    ... 
}; 
+2

Không, bạn không thể chuyển tiếp khai báo Attack, vì 'std :: vector' không thể được khởi tạo với kiểu không hoàn chỉnh. –