2011-05-27 74 views
1

我有一個虛擬方法的類定義。編譯錯誤 - 靜態成員

在編譯我得到的錯誤'MethodType Class::Method'Class

的靜態成員最流行的解決方案,我發現是關鍵字靜態添加到方法定義在頭文件。

但是,該方法被定義爲虛擬。因此,添加靜態關鍵字我將不得不刪除虛擬關鍵字。不幸的是,由於該類繼承父類,因此該方法也被聲明爲虛擬,導致另一個編譯器錯誤,因此無法完成。 (請注意,我使用定義的接口並且無法訪問父類的源代碼)

有沒有人有任何想法?


頭文件

class X : public OtherClass 
{ 
    public: 
     X(); 
     ~X(); 

    virtual structType MethodName(ParamType1,ParamType2); 

}; 

然後在CPP文件我有:

structType * X::MethodName(ParamType1 P1, ParamType2 P2) 
{ 
    //Implementation here 
} 

和得到錯誤標記:

'structType* X::MethodName' is not a static member of 'class X' 
+2

我們需要看你的班級定義。目前我不知道你在問什麼。 – 2011-05-27 09:02:58

+0

這沒有多大意義。如果您要覆蓋的基本函數是'virtual',則從派生函數中刪除關鍵字'virtual'會導致編譯錯誤;實際上它什麼都不做! – 2011-05-27 09:04:04

+0

你能提供一些代碼嗎?大多數情況下,您可以像靜態方法那樣調用方法,而不是像實例一樣。 – Centro 2011-05-27 09:05:39

回答

0

想通了。

最後。 MethodName1的實現

 structType * X::MethodName(ParamType1 P1, ParamType2 P2) 

ParamType1是一個非標準類型。它實際上是底層應用程序 中的一個類,我只有API。

原來,ParamType1類的實現丟失/未編譯/某事。

鏈接問題與我加載的類無關,即使它由於編譯器提供的行而顯示爲這樣。 因此,爲了將來的參考,當在函數定義中使用類和結構時,請注意這個鏈接錯誤。

再次感謝大家的幫助。

3

你必須做如果你想打電話,你可以撥打static沒有該類的對象的方法。這對虛擬方法沒有意義。
您必須創建該類的對象,然後調用該方法。

struct X { 
    static int bar(); 
    int foo(); 

}; 

X::bar(); // Works, static method called 
X::foo(); // Doesn't work (your problem) 

X x; 
x.bar(); // Works, but X::bar() recommended (so that one sees that it's static...) 
x.foo(); // Works, your solution 
+0

而且它不叫?‘法’ – 2011-05-27 09:06:12

+0

@centro和@Tomalak Geret'kal: 類X:公共OtherClass { 公共: X(); 〜X(); 虛擬structType方法名(ParamType1,ParamTYpe2); }; 然後在CPP文件我有: structType * X :: MethodName(ParamType1 P1,ParamType2 P2) { // Implementation here } 而且得到的錯誤標記爲: 'structType * X :: MethodName'不是'class X'的靜態成員 – GreatCthulhu 2011-05-27 09:11:42

+0

@GreaetCthulhu:請將其編輯到問題中。類定義,你如何使用它,你期望什麼,以及你實際看到了什麼。我們不知道問題是什麼。 – 2011-05-27 09:15:18

3

我認爲你有一個解析錯誤。

您的類定義說:

class X : public OtherClass { 
    public: 
     X(); 
    ~X(); 
    virtual structType MethodName(ParamType1,ParamTYpe2); 
}; 

但你對MethodName定義有不同的返回類型:

structType* X::MethodName(ParamType1 P1, ParamType2 P2) { 
    //Implementation here 
} 

編譯器真的不知道做的是什麼,並認爲你試圖用一個不存在的靜態成員做一些事情,出於某種原因。

解決方案是修復您的函數定義和聲明,以便函數具有單一一致的返回類型。可以是structTypestructType*

+0

感謝您的協助。 我修正了這兩個返回類型匹配(這是我的一個愚蠢的疏忽)。但編譯器仍然告訴我X :: MethodName不是X類的統計成員。 – GreatCthulhu 2011-05-27 09:24:18

+0

最新更新: 我感到沮喪並將文件移動到備份空間。 我創建了新文件,並將舊文件中的代碼複製到新文件中。他們編譯得很好。 這使我感到懷疑,所以我在另外兩臺機器上編譯了新文件,沒有問題。當我將舊文件移動到其他機器時,仍然無法編譯。 我以爲我一定是錯過了複製的東西,所以我用diff來檢查舊文件和新文件,差異報告沒有區別。 我認爲把這個寫成怪異的Unix巫術是安全的。 感謝您的協助。 – GreatCthulhu 2011-05-27 10:04:32

+0

@GreatCthulhu:請寫下您的解決方案作爲問題的答案,並接受它。 – 2011-05-27 14:09:40