2010-10-18 41 views
5

Tôi đã có một dự án làm việc. Sau khi sắp xếp lại một số mã, tôi đã cố gắng biên dịch lại dự án của mình và sau đó những điều kỳ lạ bắt đầu xảy ra. Hãy xem đoạn trích này từ đầu ra của trình biên dịch. Tôi đang biên soạn từ Eclipse trên Windows bằng cách sử dụng MinGW G ++.Lỗi: '...' không đặt tên là loại

**** Build of configuration Debug for project Pract2 **** 

**** Internal Builder is used for build    **** 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -omove.o ..\move.cpp 
In file included from ..\/game.h:11:0, 
       from ..\/piece.h:10, 
       from ..\/move.h:10, 
       from ..\move.cpp:7: 
..\/board.h:18:2: error: 'Piece' does not name a type 

board.h, dòng 18:

Piece* GetPieceAt(int row, int col) const; 

Thông thường khi điều đó xảy ra, tôi chỉ có thêm một số vùi Tôi đã quên làm. Nhưng tôi có trên thực tế bao gồm piece.h ở đầu bảng.h. Ý tưởng thứ hai của tôi là trình biên dịch phải đã tạo ra một lỗi ở đâu đó trong lớp Piece mà có thể gây ra trình biên dịch bỏ qua sự tồn tại của lớp, do đó sẽ gây ra nhiều lỗi hơn. Quay trở lại đầu trang Trong trường hợp đó, tôi sẽ xem xét lỗi trình biên dịch đầu tiên, mà tôi mong đợi sẽ là một lỗi về số piece.cpp hoặc piece.h. Nhưng lỗi đầu tiên không phải là về Piece ở tất cả, vì vậy tôi đã xem liệu Eclipse đã đánh dấu bất kỳ lỗi nào trong piece.cpp hoặc piece.h. Không, không phải là một đường đỏ trong tầm mắt. Tôi chỉ thấy một vài trong số these unexplained yellow markers.

Một điều cuối cùng mà tôi đã kiểm tra là mọi tệp tiêu đề đều chứa bộ bảo vệ bao gồm, mà chúng đã làm.

Làm cách nào để đến cuối lỗi này? Tôi muốn đăng đoạn mã, nhưng sau đó tôi có thể sẽ kết thúc dán toàn bộ mã (mà tôi không thể làm) vì ngữ cảnh bổ sung có thể là cần thiết.

Sửa: đây là board.h lên đến dòng 18. (Tôi đã rời ra một lời nhận xét lớn, giải thích tại sao khối mã này là nhỏ hơn bạn mong muốn.)

#ifndef BOARD_H_ 
#define BOARD_H_ 
#include "piece.h" 

class Board { 
public: 
    // Prototypes for externally defined functions 
    Board(); 
    ~Board(); 
    void PrintBoard(); 
    Piece* GetPieceAt(int row, int col) const; 
+0

Ít nhất đăng tiêu đề cho bảng.h lên dòng 18 nếu câu trả lời dưới đây của AndreyT không giúp –

Trả lời

14

Rất có thể là do "sắp xếp lại mã của bạn", bạn đã tạo một sự bao gồm vòng tròn giữa board.hpiece.h. Các tệp tiêu đề của bạn chứa các bộ bảo vệ ngăn chặn sự bao gồm vô hạn trong các trường hợp như vậy, nhưng điều đó sẽ không giúp các khai báo biên dịch.

Kiểm tra việc đưa vào vòng tròn và suy nghĩ lại chiến lược đưa bạn vào phù hợp. Nếu bạn không có bất kỳ phụ thuộc vòng tròn giữa các loại, bạn sẽ có thể loại bỏ việc bao gồm vòng tròn một cách dễ dàng. Nếu bạn có sự phụ thuộc vòng tròn giữa các loại, bạn sẽ phải sử dụng để chuyển tiếp các khai báo cho một số loại. Cố gắng bao gồm các tập tin tiêu đề trong thời trang vòng tròn sẽ không đạt được bất cứ điều gì.

+0

+ 1 - mặc dù 'class Piece;' phía trên dòng này trong 'board.h' có thể sửa nó. –

+1

Vâng, bạn đang lên một cái gì đó! 'Board' bao gồm' Piece', bao gồm 'Game', bao gồm' Board' và nó xuất hiện vô hạn. – Pieter

1

Có vẻ như piece.h và board.h được bao gồm bởi nhau. Nếu trường hợp này cố gắng sử dụng tiền tố của cả hai lớp và chỉ bao gồm tiêu đề trong các tệp cpp

Các vấn đề liên quan