Pergunta

Isso é mais ou menos cópia colada dos documentos do Boost e eu continuo recebendo um erro (na verdade muitos erros)

Estou tentando garantir que uma classe de modelo seja usada apenas com números usando o Boost. Este é um exercício de impulso, em vez de fazer uma classe de modelo que usa apenas números.

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

Os primeiros erros C2143: Sintaxe Erro: Missing ';' Antes de '<': Linha 9 C2059: Sintaxe Erro: '<': Linha 9 C2899: o nome do tipo não pode ser usado fora de uma declaração de modelo

Visual Studio 2005 btw.

Foi útil?

Solução

Você nunca criou um modelo de classe chamado A. Você acabou de criar um especialização. Você precisa primeiro criar o A Modelo de classe com um parâmetro dummy para o facilitador funcionar.

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

Outras dicas

Antes de especializar o A Modelo de aula Você teria que pelo menos declará -lo.

Uma solução depende do que você está tentando alcançar, porque o problema que você está pedindo ajuda é uma tentativa de solução para algum problema.

o Boost Documentation do enable_if tem este exemplo, que talvez seja o que você deseja:

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.,

É porque você está perdendo o ::type no final. O construto habilable_if pode ser propenso a erros às vezes. Eu uso esta pequena macro para facilitar:

#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type

Então você pode escrever o código acima como este:

template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A 
{
    int foo;
};

É muito mais fácil nos olhos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top