亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我不能使用浮點值作為模板參數?

為什么我不能使用浮點值作為模板參數?

C++
鳳凰求蠱 2019-07-30 15:53:31
為什么我不能使用浮點值作為模板參數?當我嘗試float用作模板參數時,編譯器會為此代碼而煩惱,同時int工作正常。是因為我不能float用作模板參數嗎?#include<iostream>using namespace std;template <class T, T defaultValue>class GenericClass{private:     T value;public:     GenericClass()     {         value = defaultValue;     }     T returnVal()     {         return value;     }}; int main(){     GenericClass <int, 10> gcInteger;     GenericClass < float, 4.6f> gcFlaot;     cout << "\n sum of integer is "<<gcInteger.returnVal();     cout << "\n sum of float is "<<gcFlaot.returnVal();     return 0;       }錯誤:main.cpp: In function `int main()': main.cpp:25: error: `float' is not a valid type for a template constant parameter main.cpp:25: error: invalid type in declaration before ';' token main.cpp:28: error: request for member `returnVal' in `gcFlaot',                     which is of non-class type `int'我正在閱讀Ron Penton撰寫的“游戲程序員的數據結構”,作者傳遞了一個float,但是當我嘗試它時似乎沒有編譯。
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

當前的C ++標準不允許float(即實數)或字符串文字用作模板非類型參數。您當然可以使用floatchar *類型作為普通參數。

也許作者使用的編譯器不遵循現行標準?


查看完整回答
反對 回復 2019-07-30
?
回首憶惘然

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),將計算出的浮動值的分子/分母編譯時間,然后通過這兩個作為單獨的整數參數。

請記住定義某種閾值,使浮點值彼此接近,產生相同的分子/分母,否則它有點無意義,因為它會產生前面提到的相同結果,作為不允許浮點值為 非類型的原因模板參數。


查看完整回答
反對 回復 2019-07-30
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

只是提供這是一個限制的原因之一(至少在目前的標準中)。

匹配模板特化時,編譯器會匹配模板參數,包括非類型參數。

就其本質而言,浮點值并不精確,并且C ++標準未指定它們的實現。因此,很難確定兩個浮點非類型參數何時真正匹配:

template <float f> void foo () ;void bar () {
    foo< (1.0/3.0) > ();
    foo< (7.0/21.0) > ();}

這些表達式不一定產生相同的“位模式”,因此不可能保證它們使用相同的特化 - 沒有特殊的措辭來涵蓋這一點。


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 1550 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號