3 回答
TA貢獻1784條經驗 獲得超9個贊
當前的C ++標準不允許float(即實數)或字符串文字用作模板非類型參數。您當然可以使用float和char *類型作為普通參數。
也許作者使用的編譯器不遵循現行標準?
TA貢獻1847條經驗 獲得超11個贊
簡單的回答
該標準不允許浮點作為非類型模板參數,可以在C ++ 11標準的以下部分中閱讀;
14.3.2 / 1模板非類型參數[temp.arg.nontype]
非類型非模板模板參數的模板參數應為以下之一:
對于整數或枚舉類型的非類型模板參數,模板參數類型的轉換常量表達式(5.19);
非類型模板參數的名稱; 要么
一個常量表達式(5.19),用于指定具有靜態存儲持續時間和外部或內部鏈接的對象的地址,或具有外部或內部鏈接的函數,包括函數模板和函數模板-id,但不包括非靜態類成員,表示(忽略)括號)as&id-expression,除非如果名稱引用函數或數組,可以省略&,如果相應的template-parameter是引用,則省略; 要么
一個常量表達式,其值為空指針值(4.10); 要么
一個常量表達式,其值為null成員指針值(4.11); 要么
指向成員的指針,如5.3.1中所述。
但是..但是為什么???
這可能是由于浮點計算無法以精確的方式表示。如果它被允許它可能/會在做這樣的事情時導致錯誤/奇怪的行為;
func<1/3.f> (); func<2/6.f> ();
我們打算兩次調用相同的函數,但這可能不是這種情況,因為兩個計算的浮點表示不能保證完全相同。
我如何將浮點值表示為模板參數?
隨著C++11你可以寫一些非常先進的常量表達式(constexpr),將計算出的浮動值的分子/分母編譯時間,然后通過這兩個作為單獨的整數參數。
請記住定義某種閾值,使浮點值彼此接近,產生相同的分子/分母,否則它有點無意義,因為它會產生前面提到的相同結果,作為不允許浮點值為 非類型的原因模板參數。
TA貢獻1966條經驗 獲得超4個贊
只是提供這是一個限制的原因之一(至少在目前的標準中)。
匹配模板特化時,編譯器會匹配模板參數,包括非類型參數。
就其本質而言,浮點值并不精確,并且C ++標準未指定它們的實現。因此,很難確定兩個浮點非類型參數何時真正匹配:
template <float f> void foo () ;void bar () {
foo< (1.0/3.0) > ();
foo< (7.0/21.0) > ();}這些表達式不一定產生相同的“位模式”,因此不可能保證它們使用相同的特化 - 沒有特殊的措辭來涵蓋這一點。
- 3 回答
- 0 關注
- 1550 瀏覽
添加回答
舉報
