Boost Enable_If проблема
Вопрос
Это более или менее копия, вставленная из Boost Docs, и я продолжаю получать ошибку (на самом деле ошибки)
Я пытаюсь убедиться, что класс шаблона используется только с номерами, использующими повышение. Это упражнение в повышении, а не делает класс шаблона, который использует только номера.
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
using namespace boost;
template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> // <-- this is line 9
{
int foo;
};
int main() {
return 0;
}
Первые несколько ошибок C2143: Синтаксисная ошибка: отсутствует ';' Перед '<': Line 9 C2059: Синтаксисная ошибка: '<': Line 9 C2899: TypEname нельзя использовать вне объявления шаблона
Visual Studio 2005 BTW.
Решение
Вы никогда не создали шаблон класса под названием A
. Отказ Вы только что создали Специализация. Отказ Вам нужно сначала создать A
Шаблон класса с манекенным параметром для работы для работы.
using namespace boost;
template <class T, class Enable = void>
class A { };
template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type>
{
int foo;
};
Другие советы
До специализации A
Класс шаблон вам придется хотя бы объявить его.
Решение зависит от того, что вы пытаетесь достичь, потому что проблема, которую вы просите о помощи, является попыткой решения некоторых проблем.
То Улучшение документации из enable_if
Имеет этот пример, который, возможно, это то, что вы хотите:
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };
Ура и хет.,
Это потому, что вы скучаете по ::type
в конце. Enable_If Construct может быть погрешностью иногда. Я использую этот маленький макрос, чтобы облегчить:
#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type
Тогда вы можете написать вышеуказанный код, как это:
template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A
{
int foo;
};
Это намного легче на глазах.