signos signo quinto que primer para menos mayor imprimir igual grado entonces ejercicios ejemplos codigo c++ parsing templates

c++ - quinto - signo mayor o igual ≤ en el codigo ascii



¿Cómo usar>(mayor que) dentro de un parámetro de plantilla y no aparece un error de análisis? (2)

Solo quiero definir una función basada en el tamaño del parámetro de la plantilla:

template <class T> typename std::enable_if<sizeof(T) > 1, void>::type foobify(T v) { // ... } int main() { //foobify((unsigned char)30); // should not compile foobify((long)30); }

Sin embargo, me sale:

main.cpp:8:41: error: expected unqualified-id before numeric constant typename std::enable_if<sizeof(T) > 1, void>::type

Funciona si en cambio hago 1 < sizeof(T) . Por lo tanto, creo que GCC está pensando que estoy terminando el parámetro de la plantilla, en lugar de continuar con la expresión booleana.

¿Hay alguna forma de usarlo sin tener que trabajar alrededor de él?


Sí, debes usar paréntesis:

template <class T> typename std::enable_if<(sizeof(T) > 1), void>::type foobify(T v) { // ... }


Sí, las expresiones que usan ese operador deben estar entre paréntesis. Ver [temp.names] / 3:

Al analizar una plantilla-lista-argumento , el primer > 138 no anidado se toma como delimitador final en lugar de un operador mayor que. [..] [ Ejemplo:

template<int i> class X { /* ...*/ }; X< 1>2 > x1; // syntax error X<(1>2)> x2; // OK

- ejemplo final ]

138) A los efectos de esta descripción, se considera que está anidado el tipo-id de un dynamic_cast , static_cast , reinterpret_cast o const_cast , o que contiene los argumentos de la plantilla s de un template-id posterior.

Claramente, eso no se aplica si utiliza la contraparte simétrica de esa comparación, es decir, empleando < , en su lugar, el análisis no es ambiguo en ese caso.