2017-02-20 43 views
0

我試圖模板元編程和寫一個函數來計算基礎的動力^再像3^2 = 9C++爲什麼我的模板擴展導致編譯器堆棧溢出?

template<int N> 
int Tpow(int base){return N==0?1:base*Tpow<N-1>(base);} 
int main() 
{ 
    int r3=Tpow<3>(2); 
    return 0; 
} 

只需幾行,但它崩潰GCC和鏗鏘。我哪裏錯了? 謝謝。

+0

標記爲重複。儘管另一個問題涉及「constexpr」,但這並沒有,但根本的誤解是一樣的。 –

回答

3

解決方案:您有專攻您對於N等於0,如模板:

template<> 
int Tpow<0>(int base){return 1;} 

現在你都這樣了,你還可以優化您的原始模板,像這樣:

template<int N> 
int Tpow(int base){return base*Tpow<N-1>(base);} 

,因爲您知道您處理的情況下N等於0.

說明:您的編譯器基本上是這樣做的:它把

int r3=Tpow<3>(2); 

,並就3作爲模板變量的函數,像這樣

int Tpow_3(int base){return 3==0?1:base*Tpow<3-1>(base);} 

,然後它需要做的功能2作爲模板變量,像所以

int Tpow_2(int base){return 2==0?1:base*Tpow<2-1>(base);} 

,這推移和上上,因爲編譯器不關心你的0==0?...呢。

+0

和'int'應改爲'unsigned int' – Danh

1

編譯器必須編譯整個函數體:它不能依賴三元條件來只編譯一面。所以遞歸沒有任何阻礙。

(使用C++ 11的constexpr也無濟於事)。

要解決這個問題,您需要專門爲函數爲N = 0的情況。

+1

但是,如果C++ 17的constexpr應該有幫助。 –