我有一個索引函數,並試圖將其專用於標準容器類型,但會得到錯誤。我確信它不是簡單的就是不可能的,但我不記得哪一個。我更喜歡這些作爲功能對象,但我無法做到這一點。是否有可能專門的模板函數模板類模板類的專用模板函數
namespace std { //declarations of predefined indexable types
template <class T, class A> class vector;
//others are here too, but all have the same issue
}
//default indexer
template <class T>
double indexer(const T& b) { //this seems to work fine
return b.getIndex();
}
// base types
template<> double indexer<char>(const char& b) { return double(b); }
//other primitives are here too, and work fine
// standard library
template<class T, class A>
double indexer<std::vector<T,A>>(const std::vector<T,A>& b)
{ return b.empty() ? 0 : indexer(*b.cbegin()); } //line with error
錯誤消息:
error C2768: 'indexer' : illegal use of explicit template arguments
我想爲這是專業化VS超載,因爲我有一個函數A
,需要一個功能對象/指針模板參數,以及使用默認索引器調用第一個A的重載函數A
。
template<class T, class function>
double A(T a, function F) { return F(a);} //complicated
template<class T>
double A(T a) {return A(a, indexer<T>);} //default wrapper
這似乎很有可能這是一個重複的問題,但我似乎無法找到一個。
函數模板的專門化是不需要的 - 使用重載代替。見[這裏](http://www.gotw.ca/publications/mill17.htm)爲什麼喜歡重載超過專門的功能模板。 – Simon
你不能部分專門化功能模板。你可以把這個函數包裝到一個結構中,或者像@Simon所說的那樣創建單獨的重載。 –
如果包裝器沒有模板化,是否有方法讓包裝器「A」選擇正確的索引器類型? –