2012-01-19 37 views
-1

任何人都可以告訴我爲什麼編譯這個文件時,我得到一個「Block.h:20:錯誤:多個類型在一個聲明」錯誤信息。似乎沒有什麼解決這個問題,我感到非常沮喪。在C++中獲取「多種類型在一個聲明」錯誤

Displayable.h

#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

// Information to draw on the window. 
struct XInfo 
{ 
    Display *display; 
    Window window; 
    GC  gc; 
}; 

// An abstract class representing displayable things. 
class Displayable 
{ 
public: 
    virtual void paint(XInfo &xinfo) = 0; 
}; 

Sprite.h

#include "Displayable.h" 

enum Collision { 
    NO_COLLISION = 0, 
    TOP_COLLISION, 
    RIGHT_COLLISION, 
    BOTTOM_COLLISION, 
    LEFT_COLLISION 
}; 

class Sprite : public Displayable { 

public: 
    int x, y, width, height; 

    Sprite(); 
    virtual void paint(XInfo &xinfo) = 0; 
    Collision didCollide(Sprite *s); 
}; 

Block.h

#include "Sprite.h" 

class Block : public Sprite { 
public: 
    virtual void paint(XInfo &xinfo); 
    Block(int x, int y, int width, int height); 
}; <-- **This is line 20** 
+2

其中哪些是'Block.h'? – templatetypedef

+0

最後一個(包含Block類的那個)。 –

+2

更好的是,爲什麼說錯誤在第20行,上面沒有一行有20行? – LostInTheCode

回答

1

因爲,代碼看起來不錯。我看不出特定線路有什麼問題。但是,Xlib是一個C庫,它喜歡定義相當多的宏,並且常規使用CamelCase宏。也就是說,我懷疑你的聲明中的某些事實上恰好是一個擴展到C++編譯器不喜歡的宏。爲了找到這個問題,我建議你使用無所不在的-E標誌來查看預處理源。也就是說,你會刪除任何-o標誌(和它後面的名字)和-c標誌,但否則你基本上會保留命令行。結果將被寫入標準輸出,即您要將輸出重定向到更多/更少或某個文件。

或者,你可以用一個不太可能在任何X11頭文件中使用的前綴來前綴所有名字,例如,部分名稱,冒犯性詞語等。我嘗試在我的系統上重現問題,但沒有收到錯誤消息。