2017-02-20 29 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

Компилятор должен скомпилировать весь корпус функции: он не может полагаться на тройной условный, чтобы компилировать только одну сторону. Таким образом, на рекурсии нет блока.

(Использование constexpr C++ 11 тоже не поможет).

Для решения этой проблемы необходимо, чтобы специализируется на функции для случая N = 0.

+1

Однако, если 'const_config' C++ 17 должен помочь. –

 Смежные вопросы

  • Нет связанных вопросов^_^