2010-07-19 85 views
1

我一直在嘗試使用模板一段時間,我越做越少,我意識到我理解。這個最新的問題讓我覺得它已經發現了一個相當根本的誤解,我開始比以往更多地思考,「對,明天我不應該寫任何代碼,而是找一個CS部分很好的庫,閱讀模板上的所有內容「!我想知道在同一時間你能幫助我。'typename`參數化模板和積分類型之間的差異

所以,下面的代碼,

template <typename T> // or replace `typename` with `class` 
struct Foo { 
    struct Bar {}; 
    Foo(Bar) {} 
}; 

Foo<float>::Bar x; 
Foo<int> y (x); 

不能編譯,因爲xFoo<float>::Bar類型,但構建y我們需要一個Foo<int>::Bar。這很好,和預期,但現在考慮下面,

template <int I> 
struct Foo { 
    struct Bar {}; 
    Foo(Bar) {} 
}; 

Foo<0>::Bar x; 
Foo<1> y (x); 

我希望/思(雖然,謝天謝地,還未依靠),其xFoo<0>::Bar型和構建y我們需要一個Foo<1>::Bar,因此它不會編譯 - 如前例所示。但似乎兩者其實都是Foo<int>::Bar這樣的類型,所以會編譯成

所以,我想知道,首先是描述typename/class參數化模板和參數化整型參數化模板之間這種區別的正確術語,還有其他什麼不同之處呢?用來解決這個問題,並獲得這個簡單的例子所需的行爲,以便Foo<0>Foo<1>將描述不兼容的類型?

而且,在圖書館之旅之前,任何有關「必要」,在線閱讀材料的鏈接都將受到歡迎。 謝謝。

+2

你的後一個例子不能在GCC上編譯。你正在使用哪種編譯器? – Yuji 2010-07-19 21:50:00

+2

你給出的代碼當然不應該編譯,因爲你給出的原因是:'Foo <0>'和'Foo <1>'是不同的類型。你正在使用哪種編譯器? – 2010-07-19 21:50:56

+0

並將此列表帶到您的圖書館:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2010-07-19 21:53:09

回答

2

在GCC 4.4.3您的第二個例子失敗消息來編譯「錯誤:調用沒有匹配的函數‘富< 1> ::美孚(美孚< 0> ::酒吧&)’」,這是正是你期望發生的事情。

所以你沒有誤解任何東西。如果這爲你編譯,這是你的編譯器的非標準行爲。