Boost enable_if Problem
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.
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.