шаблоны и тернарный оператор
От: alzt  
Дата: 10.06.08 11:47
Оценка:
Добрый день всем.

Почему не работает подобная конструкция

template<int n> struct Fact
{
enum { value = n>2?
n * Fact<n-1>::value
: 1};
};

?
Re: шаблоны и тернарный оператор
От: alzt  
Дата: 10.06.08 11:48
Оценка:
Извиняюсь за теги:
template<int n> struct Fact
{
   enum { value = n>2?
      n * Fact<n-1>::value
      : 1};
};
Re: шаблоны и тернарный оператор
От: Bell Россия  
Дата: 10.06.08 11:55
Оценка: 2 (1)
Здравствуйте, alzt, Вы писали:

A>Добрый день всем.


A>Почему не работает подобная конструкция

A>

A>template<int n> struct Fact
A>{
A> enum { value = n>2?
A> n * Fact<n-1>::value
A> : 1};
A>};

A>?

Потому что получается бесконечная рекурсия при инстанциировании шаблона. Рекурсию можно остановить сециализацией:

template<int n> struct Fact
{
   enum { value = n * Fact<n-1>::value};
};

template<> struct Fact<1>
{
   enum { value = 1};
};
Любите книгу — источник знаний (с) М.Горький
Re[2]: шаблоны и тернарный оператор
От: alzt  
Дата: 10.06.08 12:10
Оценка:
Здравствуйте, Bell, Вы писали:

A>>Почему не работает подобная конструкция

A>>

A>>template<int n> struct Fact
A>>{
A>> enum { value = n>=2? //подправил
A>> n * Fact<n-1>::value
A>> : 1};
A>>};

A>>?

B>Потому что получается бесконечная рекурсия при инстанциировании шаблона. Рекурсию можно остановить сециализацией:


B>
B>template<int n> struct Fact
B>{
B>   enum { value = n * Fact<n-1>::value};
B>};

B>template<> struct Fact<1>
B>{
B>   enum { value = 1};
B>};
B>


Спасибо.
Наконец-то дошло, я не мог понять, почему в тернарном операторе не прекращается поиск при достижении n<2.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.