Impulsar enable_if problema
Pregunta
Esto es más o menos copia pegada de los documentos del impulso y sigo recibiendo un error (en realidad un montón de errores)
Estoy tratando de asegurarse de que una clase de plantilla sólo se utiliza con números utilizando impulso. Este es un ejercicio de impulso, en lugar de hacer una clase de plantilla que sólo utiliza 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;
}
Los primeros errores C2143: error de sintaxis: falta ';' antes '<': línea 9 C2059: error de sintaxis: '<': línea 9 C2899: nombre de tipo no puede ser utilizado fuera de una declaración de plantilla
Visual Studio 2005 por cierto.
Solución
Nunca se crea realmente una plantilla de clase llamada A
. Que acaba de crear un especialización . Es necesario crear primero la plantilla de clase A
con un parámetro ficticio para el habilitador de trabajo.
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;
};
Otros consejos
Antes de la plantilla de clase especializada A
que tendría que declarar al menos a él.
Una solución depende de lo que estamos tratando de lograr, porque el problema que está pidiendo ayuda acerca es un intento de solución a algún problema.
El Boost documentación de enable_if
tiene este ejemplo, que tal vez es lo que desea:
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> { ... };
Saludos y HTH.,
Su porque se echa en falta la ::type
al final. Enable_if constructo puede ser de error a veces propensas. Yo uso esta pequeña macro para que sea más fácil:
#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type
A continuación, se puede escribir el código anterior como esto:
template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A
{
int foo;
};
Es mucho más fácil en los ojos.