參考

2016-09-14 54 views
1

我得到了以下運行參考

using namespace std; 
#include <iostream> 

template<typename a> struct function 
{ 
    void self1(){ cout << "hello world 1111" << endl; } 
}; 

template<typename a> struct function<a&> 
{ 
    void self2() { cout << "hello world 2222" << endl; } 
}; 


int main() 
{ 
    function<int> a; 
    a.self1(); 
    function<int&> b; 
    b.self2(); 
    return 0; 
} 

結果代碼:

hellow world 1111 
heloow world 2222 

想問的第一個「結構功能」,第二個「結構之間的關係船功能「

第二個被分類爲第一個」模板專業化「嗎? (似乎不是)

我可以看到,第二個是基於第一個。 (通過刪除第一個,它是不可編譯的)。但是

b.self1() is not defined. 

因此,不知何故第二次重新定義了結構到一個新的?

+0

是的,這是模板專業化。 –

+0

@GillBates Thx,我通常的理解是模板專門化會定義類型爲bool/int等等。現在它被定義爲一個參考。我會更深入地瞭解這些知識。 – thundium

回答

1

我可以看到,第二個是基於第一個。 (通過刪除 第一個,它不是可編譯的)。但是

b.self1()未定義。所以第二個已經重新定義了結構 到一個新的?

function是一個結構模板,它不是一個結構本身。在實例化一個像你這樣做的時刻:function<int> a;編譯器生成一個struct function_int,其中包含所有T's(或a's在這種情況下)的int

template<typename a> struct function<a&> 

這是結構模板的一個特例,這些會用來爲當a是引用類型。這種專業化不能使用「原始」結構模板的任何成員/方法。

+0

這是什麼意思,專業化分享什麼與主要模板?這是一種專門化,如果主模板不存在,它將不會編譯。這不夠嗎? – skypjack

+0

@Sypypjack因爲你不能在這個專長中使用'self1()'。 –

+0

我明白你的觀點。那麼,實際上_沒有什麼不是說這種最好的方式。我的兩分錢。 :-) – skypjack