類別樣板具現化
不同於函式樣板,對類別樣板進行具現化時,您必須藉由提供類別樣板的引數,明確地具現化類別。 若要建立 TempClass 的執行個體:
TempClass< float, 6 > test1; // OK
TempClass< char, items++ > test2; // Error, second parameter
// must be constant.
當具現化類別或函式時,編譯器會產生樣板類別或函式的程式碼。 成員函式會在呼叫時進行具現化,而虛擬成員函式則是在建構其類別時進行具現化。 如果您是要為其他使用者建構具有樣板的程式庫,這可能會造成問題。 如需詳細資訊,請參閱明確具現化。
類別樣板會先由編譯器進行特製化,然後再進行具現化。 編譯器會在建立此樣板類別成員的參考、在類別上使用 sizeof,或建立執行個體時,才會具現化類別範本。
樣板的明確特製化是特定類型之範本的自訂版本。
// template_instantiation2.cpp
template<class T> class X
{
};
// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}
不含 template<> 的明確特製化會產生錯誤。 Visual C++ .NET 2003 之前的 Visual C++ 版本接受這個語法:
// Explicit specialization of X with 'char'
class X<char> // C2906
{
};
如果樣板已明確具現化或特製化過一次,則無法在相同程式中針對相同一組樣板引數進行明確具現化或特製化第二次。 允許對不同樣板引數進行進一步的特製化。
如果沒有針對特定樣板引數的明確具現化或特製化,則樣板將會隱含地在第一次使用的位置進行具現化。
因為相同樣板的不同樣板具現化的類型不同,樣板的特製化或具現化的靜態成員,不同於相同樣板的特製化或具現化的靜態成員。