我試圖模板元編程和寫一個函數來計算基礎的動力^再像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和鏗鏘。我哪裏錯了? 謝謝。
我試圖模板元編程和寫一個函數來計算基礎的動力^再像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和鏗鏘。我哪裏錯了? 謝謝。
解決方案:您有專攻您對於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?...
呢。
和'int'應改爲'unsigned int' – Danh
編譯器必須編譯整個函數體:它不能依賴三元條件來只編譯一面。所以遞歸沒有任何阻礙。
(使用C++ 11的constexpr
也無濟於事)。
要解決這個問題,您需要專門爲函數爲N = 0的情況。
但是,如果C++ 17的constexpr應該有幫助。 –
標記爲重複。儘管另一個問題涉及「constexpr」,但這並沒有,但根本的誤解是一樣的。 –