2012-08-04 231 views
2

我一個網站,該聲明爲什麼浮點類型模板函數的模板參數類型無效?

template <int x> 
int func() { 
    return x; 
} 

是有效的,而下面就看是不是

template <double x> 
double func() { 
    return x; 
} 

爲什麼是一個模板函數的第一個法律聲明,而第二個是不是?

+1

鏈接到網站將是有幫助的。 – 2012-08-04 05:13:13

+0

它只是一個mcq,其中有3個選項,其中這些是前兩個,第三個是涉及typename的模板聲明,並且必須選取無效的,並且答案是雙精度。 – Dhatri 2012-08-04 05:15:27

+5

我認爲它基本上歸結爲很難指定什麼樣的浮點相等意味着可以在不同的編譯器和浮點表示中合理地工作。 – 2012-08-04 05:19:59

回答

3

它是無效的,因爲它不是一個整數類型。對非模板模板參數有一定的限制,這是其中之一,它說...

浮點數和類類型對象不允許作爲非類型模板參數。

template <double VAT>  // ERROR: floating-point values are not 
double process(double v) { // allowed as template parameters 
    return v * VAT; 
} 

template <std::string name> // ERROR: class-type objects are not 
class MyClass {    // allowed as template parameters 
    /* ... */ 
}; 

上面從C++ Templates引述。我沒有拿它的信用。

根據我的理解,它們對模板初始化無效的原因是因爲像float和double這樣的類型在C++中沒有定義的實現。所以,當像

template <double VAT> double process(double v); 

模板與兩個不同的雙值

template <(double) 2/3> double process(2.3) 

template <(double) 1/3> double process(2.4); 

初始化,它們可能沒有因爲雙無類型,其迷惑編譯器相同的比特表示。

+1

問題是*爲什麼浮點類型不是有效的非類型模板參數。 – Praetorian 2012-08-04 05:33:41

+0

@Prætorian-根據我的理解添加了原因。如果錯誤,請糾正。 – vidit 2012-08-04 06:25:47