2011-05-10 121 views
25

我讀的模板的完全指南和它說以下內容:模板類成員函數只有專業化

凡在談論類模板特殊化。

但是,如果你的專業類 模板,還必須專門所有 成員函數。雖然 可能會專門化爲單一成員 功能,但一旦完成,您的 就不能再專門化整個 類。

我真的想知道這是如此的真實,因爲你可以在沒有任何成員函數的情況下進行專門化。是不是說只有一個成員函數和另一個成員函數都沒有專精?

有人可以澄清?

回答

29

我認爲它指的是以下情況:

template <typename T> 
struct base { 
    void foo() { std::cout << "generic" << std::endl; } 
    void bar() { std::cout << "bar" << std::endl; } 
}; 
template <> 
void base<int>::foo() // specialize only one member 
{ 
    std::cout << "int" << std::endl; 
} 
int main() { 
    base<int> i; 
    i.foo();   // int 
    i.bar();   // bar 
} 

一旦做到這一點,你不能專注完整模板是任何其他的東西,所以

template <> 
struct base<int> {}; // error 
+0

你應該也許要注意,如果你*不*只是專門化成員並且使用了上面完整的模板專門化,那麼* specialization *仍然有效 - 依賴於'foo'和'bar'的調用代碼不再存在是。也就是說,你在上面發佈的相同代碼,修改爲不專門化的成員,而不是調用'foo'和'bar'將工作正常 - 請參閱http://ideone.com/3kHa3 – rlc 2011-05-10 12:59:20

+0

所以我想這一個成員專業化創建一個實例因此你不能再有專業化了? – 2011-05-10 13:12:27

+8

@託尼 - 對,但你當然可以有另一種不同類型的專業化,比如'base '。 – 2011-05-10 13:40:24

0

我覺得是什麼意思是,你可以:

  • 專門全班和(數據和函數,靜態與否,虛擬或沒有)被宣佈即使中定義的所有成員它們與非專用版本相同,但是你不能專門化整個類(即所有成員都以與非專用案例相同的方式聲明,你只是爲某些功能成員提供實現)。