Выбор типа с помощью mpl :: if_ и целочисленного параметра шаблона - PullRequest
2 голосов
/ 26 января 2012

Следующий код работает на Visual Studio 2005, но выдает ошибку компиляции при компиляции с g ++ 4.4.5:

#include <boost/mpl/if.hpp>
#include <boost/mpl/bool.hpp>

template<int X> struct A
{
    void f() {
        typedef boost::mpl::if_<boost::mpl::bool_<X == 1>, int, bool>::type Type;
    }
};

Это ошибка, которую я получаю:

main.cpp: In member function ‘void A<X>::f()’:
main.cpp:12: error: too few template-parameter-lists

Что не так с кодом?Если я заменю шаблонный X на жестко закодированное число, код компилируется просто отлично.Я также попытался обернуть X типом mpl :: int_, но безуспешно.

Спасибо!

1 Ответ

2 голосов
/ 26 января 2012

Вам необходимо ключевое слово 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 Ключевое слово.

См. подробное объяснение здесь: Где и почему я должен поместить ключевые слова шаблона и типа .

...