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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top