Domanda

Questo è più o meno copia incollato da docs Boost e continuo a ricevere un errore (in realtà un sacco di errori)

sto cercando di fare in modo che una classe template viene utilizzato solo con i numeri che utilizzano spinta. Questo è un esercizio di impulso, piuttosto che fare una classe template che utilizza solo i numeri.

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

I primi errori C2143: errore di sintassi: manca ';' prima di '<': linea 9 C2059: errore di sintassi: '<': linea 9 C2899: typename non può essere utilizzato al di fuori di una dichiarazione modello

Visual Studio 2005 btw.

È stato utile?

Soluzione

Non si può mai effettivamente creato un modello di classe chiamata A. È appena creato un specializzazione . È necessario creare prima il modello di classe A con un parametro fittizio per l'attivatore di lavoro.

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

Altri suggerimenti

Prima specializzata del modello di classe A si dovrebbe almeno dichiararla.

Una soluzione dipende da ciò che si sta cercando di ottenere, perché il problema che stai chiedendo aiuto su è un tentativo di soluzione a qualche problema.

Il Boost documentazione di enable_if ha questo esempio, che forse è quello che si desidera:

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

Saluti e hth.,

Il suo perché vi manca il ::type alla fine. Enable_if costrutto può essere errore a volte inclini. Io uso questa macro poco per rendere più facile:

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

Quindi è possibile scrivere il codice precedente in questo modo:

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

La sua molto più facile per gli occhi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top