我讀的模板的完全指南和它說以下內容:模板類成員函數只有專業化
凡在談論類模板特殊化。
但是,如果你的專業類 模板,還必須專門所有 成員函數。雖然 可能會專門化爲單一成員 功能,但一旦完成,您的 就不能再專門化整個 類。
我真的想知道這是如此的真實,因爲你可以在沒有任何成員函數的情況下進行專門化。是不是說只有一個成員函數和另一個成員函數都沒有專精?
有人可以澄清?
我讀的模板的完全指南和它說以下內容:模板類成員函數只有專業化
凡在談論類模板特殊化。
但是,如果你的專業類 模板,還必須專門所有 成員函數。雖然 可能會專門化爲單一成員 功能,但一旦完成,您的 就不能再專門化整個 類。
我真的想知道這是如此的真實,因爲你可以在沒有任何成員函數的情況下進行專門化。是不是說只有一個成員函數和另一個成員函數都沒有專精?
有人可以澄清?
我認爲它指的是以下情況:
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
我覺得是什麼意思是,你可以:
專門全班和(數據和函數,靜態與否,虛擬或沒有)被宣佈即使中定義的所有成員它們與非專用版本相同,但是你不能專門化整個類(即所有成員都以與非專用案例相同的方式聲明,你只是爲某些功能成員提供實現)。
你應該也許要注意,如果你*不*只是專門化成員並且使用了上面完整的模板專門化,那麼* specialization *仍然有效 - 依賴於'foo'和'bar'的調用代碼不再存在是。也就是說,你在上面發佈的相同代碼,修改爲不專門化的成員,而不是調用'foo'和'bar'將工作正常 - 請參閱http://ideone.com/3kHa3 – rlc 2011-05-10 12:59:20
所以我想這一個成員專業化創建一個實例因此你不能再有專業化了? – 2011-05-10 13:12:27
@託尼 - 對,但你當然可以有另一種不同類型的專業化,比如'base'。 –
2011-05-10 13:40:24