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