Вам необходимо ключевое слово typename
:
typedef typename // <-- Here
boost::mpl::if_<
boost::mpl::bool_<X == 1>,
int,
bool
>::type Type;
Компилятор не может быть уверен, что mpl::if_<...>::type
является типом, так как он не знает значения X
: if_
может бытьспециализируется на определенных параметрах и включает type
член, который не является типом, например:
//Silly if_ specialization
template <typename Then, typename Else>
struct if_<void, Then, Else>
{
int type;
};
Следовательно, вам нужно явно указать компилятору, что ::type
обозначает тип, с typename
Ключевое слово.
См. подробное объяснение здесь: Где и почему я должен поместить ключевые слова шаблона и типа .