說到特製化template,他前面沒有template
先一步步來看
template <>
class Printer<int> {
public:
static int count;
void print(){}
};
像這樣一段程式碼是無法單獨存在的,特製化樣板一定得有個原始樣板才能特製化
上面的程式會出現以下訊息
Printer.h:17: error: Printer is not a template
Printer.h:17: error: explicit specialization of non-template Printer
Printer.h:23: error: expected initializer before < token
警告一定要有個原始樣板,所以得改成如下
//原始樣板
template <class T>
class Printer{
T a;
};
template <>
class Printer<int> {
public:
static int count;
void print(){}
};
而這時候問題來了,前面提過當樣板類別要把實作拉開的時候,都要加上template<class T>
但是這個特製化樣板用的是template <>阿 該怎麼辦呢?
答案是:都不用加
template <>
class Printer<int> {
public:
static int count;
static void print();
};
int Printer<int>::count=1;
void Printer<int>::print(){
cout<<"Hello!"<<endl;
}
只要小心樣板的型態就可以了
這裡要小心一點Printer<T>根據T的不同其實可以看成不同的類別
考慮下面一段程式
template <class T>
class Printer{
T a;
public:
static int count;
};
template <class T>
int Printer<T>::count=1;
...
int main() {
cout<<Printer<float>::count++<<endl;
cout<<Printer<double>::count++<<endl;
cout<<Printer<float>::count++<<endl;
cout<<Printer<double>::count++<<endl;
return 0;
}
//output:
1
1
2
2
Printer<float>跟Printer<double>是用不同的count
1 則留言:
> Printer<T>根據T的不同其實可以看成不同的類別
事實上不同 T 的 Printer<T> 根本就是不同的類別.
張貼留言