Вопрос

Это более или менее копия, вставленная из 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;
};

Это намного легче на глазах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top