Boostez enable_if problème
Question
Ceci est plus ou moins copier collé de docs boost et je continue à avoir une erreur (en fait beaucoup d'erreurs)
Je suis en train de faire en sorte qu'une classe de modèle est utilisé avec des chiffres à l'aide de boost. Ceci est un exercice de coup de pouce, plutôt que de faire une classe de modèle qui utilise uniquement des chiffres.
#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;
}
Les premières erreurs C2143: erreur de syntaxe: manquant ';' avant '<': ligne 9 C2059: erreur de syntaxe: '<': ligne 9 C2899: typename ne peut pas être utilisé en dehors d'une déclaration de modèle
Visual Studio 2005 btw.
La solution
Vous jamais réellement créé un modèle de classe appelée A
. Vous venez de créer un spécialisation . Vous devez d'abord créer le modèle de classe A
avec un paramètre fictif pour le facilitateur au travail.
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;
};
Autres conseils
Avant de se spécialiser le modèle de classe A
vous aurait au moins déclarer.
Une solution dépend de ce que vous essayez d'atteindre, parce que le problème que vous demander de l'aide au sujet est une tentative de solution à un problème.
Le documentation Boost de enable_if
a cet exemple, ce qui est peut-être ce que vous voulez:
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> { ... };
Vive et HTH.
Son parce que vous manque le ::type
à la fin. Enable_if construction peut être erreur parfois sujettes. J'utilise cette petite macro pour le rendre plus facile:
#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type
Ensuite, vous pouvez écrire le code ci-dessus comme ceci:
template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A
{
int foo;
};
Son beaucoup plus facile sur les yeux.