2011-02-24 59 views
0

我有以下代碼不按預期編譯。我有一個具有靜態成員函數的類,另一個類包含試圖使用它的頭。它似乎沒有工作。靜態成員函數沒有按預期工作

static bool validLocation(int _x) // within class A 
{ 
    return false; 
}; 

B類包括類A,並具有在其功能之一下面的調用:

if (!(A::validLocation(180))) 
    continue; 

顯然,這些被簡化用於讀的目的,但是這是爲什麼不能接受?

對不起,模糊不清。至於錯誤信息:

"A::validLocation(int)", referenced from: B::functionThatCallsThis() in B.o 

Symbols not found. 
Collect2: ld returned 1 exit status 

靜態函數是公開的,在頭文件中聲明。

+4

現在缺少的是編譯器錯誤消息;) – 0xC0000022L 2011-02-24 17:39:40

+0

哇,感謝。半睡着了。我將更新 – jackz 2011-02-24 17:47:15

+0

您是否嘗試從所有命名空間(領先的'::')轉義,然後顯式限定類的命名空間?也許'B班'看到A,但不是正確的?!爲了排除這種情況,你可以暫時讓B成爲A的「朋友」(然後我們確定它不是關於隱藏的成員函數等等)。 – 0xC0000022L 2011-02-24 17:52:25

回答

2

編輯:你還記得鏈接A.oB.o在一起創建你的二進制文件嗎?這聽起來像A.o沒有包括在內,編譯器沒有內聯靜態函數。

而且你有;那絕對不是你所需要的功能的結束,可能是無效的(我不記得)

+0

沒有。這絕對是公開的。奇怪。對不起,我剛剛意識到我的留言是多麼模糊。我會清除它 – jackz 2011-02-24 17:46:17

+0

流浪分號不是無效的。這只是一個空洞的表達。像PCLINT這樣的工具將會指出它。 – 0xC0000022L 2011-02-24 17:57:28

+0

如果該函數確實是在類A中定義的,則它必須隱式內聯,對嗎?不需要包含目標文件。不需要該對象文件甚至不存在。 – 2011-02-24 18:15:27

3

從你給的錯誤消息,我會假設你不是活得t將這些對象鏈接在一起,或者您將validLocation()聲明爲自由函數,因爲在定義之前我沒有看到A::。很難說這裏給出了大量的信息。

編輯:

現在的錯誤信息更清晰一點,它看起來像你是不是包括了正確的目標文件的鏈接。

0

當你定義你的函數validLocation()時,你是在單獨的文件中定義,.cpp也許?如果是這樣,你需要把A ::函數名之前,像這樣:

static bool A::validLocation(int _x) // within class A 
{ 
    return false; 
};