Увеличить проблему enable_if - PullRequest
0 голосов
/ 01 ноября 2010

Это более или менее копия, вставленная из буст-документации, и я получаю ошибку (на самом деле много ошибок)

Я пытаюсь убедиться, что шаблонный класс используется только с числами, использующими boost. Это упражнение на повышение, а не создание шаблонного класса, который использует только цифры.

#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: синтаксическая ошибка: отсутствует ';' до '<': строка 9 C2059: синтаксическая ошибка: '<': строка 9 C2899: имя типа не может использоваться вне объявления шаблона </p>

Visual Studio 2005, кстати.

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

Прежде чем специализироваться на шаблоне класса A, вам нужно хотя бы объявить его.

Решение зависит от того, чего вы пытаетесь достичь, поскольку проблема, о которой вы просите помощи, заключается впопытка решения какой-то проблемы.

Документация Boost из 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> { ... };

Cheers & hth.

1 голос
/ 10 февраля 2012

Это потому, что вам не хватает ::type в конце.Конструкция Enable_if иногда может быть подвержена ошибкам.Я использую этот маленький макрос, чтобы упростить его:

#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;
};

Это намного проще для глаз.

1 голос
/ 01 ноября 2010

Вы никогда не создавали шаблон класса с именем 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;
};
...