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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top