2013-01-20 39 views
-2

我想編譯我的代碼,我無法弄清楚我做錯了什麼。 我相信這可能是我彙編的順序,但我無法弄清楚我的錯誤。C++「不命名一個類型」 - 無法編譯源文件

我的錯誤代碼:

g++ -w -c JokeServer.cpp 
In file included from JokeServer.h:4:0, 
       from JokeServer.cpp:52: 
AdminServer.h:9:2: error: ‘JokeServer’ does not name a type 
make: *** [JokeServer.o] Error 1 

謝謝。

JokeServer.h文件:

#ifndef JOKESERVER_H 
#define JOKESERVER_H 

#include "AdminServer.h" 
#include "Subject.h" 
#include "Observer.h" 
#include "Worker.h" 

class JokeServer: public Subject { 
private: 
    AdminServer* m_admin_server; 

public: 
    //public functions 
}; 

#endif 

AdminServer.h文件:

#ifndef ADMINSERVER_H 
#define ADMINSERVER_H 

#include "JokeServer.h" 
#include "AdminWorker.h" 

class AdminServer { 
private: 
    JokeServer* m_joke_server; 

public: 
    //public functions   
}; 

#endif 

我的make文件:

CPPFLAGS = g++ -w 

all: JokeServer JokeClient AdminClient 

#------------------------------------- 
# JOKE SERVER 
#------------------------------------- 
JokeServer: JokeServer.o Worker.o JokeGenerator.o ProverbGenerator.o AdminServer.o AdminWorker.o 
    $(CPPFLAGS) JokeServer.o Worker.o JokeGenerator.o ProverbGenerator.o AdminServer.o AdminWorker.o -o JokeServer -lpthread 

JokeServer.o: JokeServer.cpp JokeServer.h Subject.h 
    $(CPPFLAGS) -c JokeServer.cpp 

Worker.o: Worker.cpp Worker.h Observer.h 
    $(CPPFLAGS) -c Worker.cpp 

JokeGenerator.o: JokeGenerator.cpp JokeGenerator.h 
    $(CPPFLAGS) -c JokeGenerator.cpp 

ProverbGenerator.o: ProverbGenerator.cpp ProverbGenerator.h 
    $(CPPFLAGS) -c ProverbGenerator.cpp 

AdminServer.o: AdminServer.cpp AdminServer.h 
    $(CPPFLAGS) -c AdminServer.cpp 

AdminWorker.o: AdminWorker.cpp AdminWorker.h 
    $(CPPFLAGS) -c AdminWorker.cpp 
+1

什麼是錯誤? – sgarizvi

+0

cpp文件怎麼樣? –

+1

您需要製作一個*最小*示例來顯示您的問題。有些文件你沒有在這裏顯示,但已經太長,因爲堆棧溢出問題。可能你需要在你的頭文件中轉發聲明一個或多個類型,因爲它們相互引用很多。 (即http://www.parashift.com/c++-faq/forward-decl.html,但跨文件) – Flexo

回答

5

你有你的.h文件之間的循環引用 。文件AdminServer.hJokeServer.h包括彼此。你應該使用前向聲明來解決這個問題。

例如,在JokeServer.h

另請注意,所有的文件都間接包括AdminServer.h通過包括JokeServer.h(例如,我懷疑,JokeServer.cpp)將有包括AdminServer.h訪問類的定義AdminServer

+0

謝謝安迪,那工作。這是我第一次遇到循環引用,我會記住這一點以備將來。 – Gene

+0

@Gene:據我所知,頭文件的循環依賴會導致奇怪的編譯錯誤,並且第一次創建頭文件時很難弄清楚發生了什麼。 C++還不支持模塊*。 –