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
oconst_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.