2012-09-22 89 views
1

我想寫一個定點運算類,其中點位置和基本類型是模板部分專門明確的模板特

template <int P, typename T> 
class basic_fixedpoint{ 
    //stuff 
}; 

我也想公開一個模板隱構造函數,然後專門爲各種類型

//inside basic_fixedpoint 
    template <typename U> 
    basic_fixedpoint(const U& arg); 

在其他地方我將實施整型,浮點,雙等專業化不過,我也希望爲不同的P和T.任何類型basic_fixedpoint的通用專業化我怎樣才能做到這一點的模板模板專業化?

template <int P, typename T> //for the class whose constructor i specialize 
template <int OP, typename OT> //for the parameters of the argument 
basic_fixedpoint<P, T>::basic_fixedpoint<basic_fixedpoint<OP, OT> >(const basic_fixedpoint<OP, OT>& arg) 
    : /*init things here*/ {} // this fails 

我試圖避免超載的構造,以便在頭部呈現一個單一的界面,告訴用戶「這一類將乾淨地從你給任何類型它自身建設,否則將無法編譯並給你一個難以理解的段落長錯誤信息「

作爲一個子問題:這個類還實現了基本的運算符int(),運算符float(),運算符double()轉換以及重載算術運算符和數學函數提供。當然,每當我嘗試用這個類調用任何東西時,調用都是不明確的,因爲每個可能都是可用的。

我該如何保持這個類的完全靈活性,但仍然允許無痛的,毫不含糊的重載函數調用的行爲正確(而不是總是將我的類轉換爲double和back)?

回答

2

我想你可能想重新考慮你真正想要的東西。隱式轉換並不總是一個好主意(它們通常不是一個好主意),而且可以隱式轉換爲相同類型的類並不是一個好主意(每當使用該類時都會引起歧義錯誤,可轉換/從類型在一起,因爲它可能是雙向的。

你應該回到設計板,並決定什麼需要是隱含的,哪些可以命名爲明確轉換。

除此之外,關於你的特定問題,你不能專注於這個構造函數。函數(和其中的構造函數)只能是完全專用的,尤其是你不能特殊化ze是一個模板函數,它是模板類的成員,而不需要完全專門化類模板。即你可以專注:

basic_fixedpoint<5,int>::basic_fixed_point<int>(int) 

,但你不能專注:

template <int N, typename T> 
basic_fixed_point<N,T>::basic_fixed_point<int>(int) 

由於NT在專業化未綁定。