2009年5月20日 星期三

特製化template設定初使值及分開實作

剛剛想到的問題,趁現在腦袋瓜還活著把他記下來
說到特製化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 則留言:

fr3@K 提到...

> Printer<T>根據T的不同其實可以看成不同的類別

事實上不同 T 的 Printer<T> 根本就是不同的類別.