2014-05-08 45 views
3

下面是一些代碼寫在C++:Typedef-爲什麼這個C++代碼有效?

#include <iostream> 
int main(){ 
    typedef map<int,int> b; 
    b tC; 

    b::iterator iMap; 
    b().swap(tC); 
} 

我已經試過:
b.swap(tc); 但我不斷收到錯誤。

我不明白的是,爲什麼不能是b.swap(tC);

這是編譯器問題嗎?

對不起,我的英語。

+2

它相當於'map .swap(tC);'。你不指望這個工作,是嗎? – molbdnilo

回答

3

b::swap(x)會工作,如果swap()是一個靜態類方法。但是swap()是一種實例方法,因此只能在類b(即的typedef)的對象的實例上工作。

b().swap(x)不會發出錯誤,因爲它適用於類b的對象的實例。然而,這個調用不可能有用,因爲這個實例b()在實例化後立即被銷燬。

+0

如果swap()應該是一個靜態方法,那麼調用應該是b :: swap(x) – Subhajit

+0

謝謝 - 修正。這對於Java是有效的,太多的Java可能會阻塞你的思想! :) – mvp

3

因爲成員函數只能通過一個對象調用,所以需要在調用swap之前創建一個對象。因此在:

b().swap(tC); 

您正確創建一個臨時對象,並使用tC交換它。

+1

我想這條線聽起來很奇怪 - 「因爲b是一個類,因此它沒有成員函數。」 – SChepurin

9

因爲b是一種類型。你不能在類型上調用swap。你需要建立b類型的對象,然後調用swap就可以了,這是你與b().swap(tC);

做這一行typedef map<int,int> b;是創建一個新類型,稱爲b,其中有map<int,int>屬性。因此,爲了使用b類型和b類型的對象,您必須遵循相同的規則,就好像您在使用類map<int,int>一樣。

在類map中,函數swap是成員函數。這就是爲什麼你需要一個對象才能使用它。如果它是一個靜態的功能,你可以直接調用它的類型,雖然該語法有一點不同:(!但不是b.swap(x)b::static_function()

+0

由於已經有很多答案,我只是在這裏添加這個註釋:似乎sannim是一個初學者,因此它可能值得解釋爲什麼b是一種類型,或者更好地解釋typedef的一般含義 – Shelling