2013-06-19 87 views
0

是否可以顯式實例化模板函數的一個或多個專業化?第二,這個函數是否是類成員是否重要? 它是合法的C++ 11,它也被編譯器接受,所以它不會出現問題嗎?C++模板函數:顯式實例化一個或多個專業化

+0

您是否閱讀過約翰內斯的回答[此問題](http://stackoverflow.com/questions/5512910/explicit-specialization-of-template-class-member-function?rq=1),我認爲非常接近你的要求(至少是第二部分)。 – WhozCraig

回答

1

是否可以顯式實例化模板函數的一個或多個特化?

是的,但是, [temp.explicit]/5:

對於一個給定的模板參數,如果一個模板的顯式實例化一個明確的專業化應該是一個聲明後出現模板,顯式實例化不起作用。


其次,它的問題如果該函數是一個類的成員?

不,AFAIK; [temp.explicit]/1:

的類,函數或構件模板特殊化可以明確地從它的模板實例化。 類模板的成員函數,成員類或靜態數據成員可以從與其類模板關聯的成員定義中顯式實例化。類模板的函數模板或成員函數的顯式實例化不應使用inline或constexpr說明符。

從[temp.explicit]/3實施例:

template<class T> class Array { void mf(); }; 
template class Array<char>; 

template void Array<int>::mf(); 

template<class T> void sort(Array<T>& v) { /∗ ... ∗/ } 
template void sort(Array<char>&); // argument is deduced here 

namespace N { 
template<class T> void f(T&) { } 
} 
template void N::f<int>(int&); 

是否合法C++ 11並且也通過它編譯器接受所以它沒有附帶問題?

嗯,是的,但對於圖書館來說,總是存在ABI兼容性的問題;特別是如果不同的編譯器已經用於庫和圖書館用戶(例如包括該庫的程序)。 C++標準沒有指定ABI。