Estoy tratando de usar SFINAE para distinguir una clase que tiene un miembro llamado 'nombre'. Configuré las cosas en lo que parece ser el patrón estándar, pero no funciona: en lugar de ignorar silenciosamente la sustitución "fallida", el compilador produce un error.SFINAE: algunas fallas más iguales que otras?
Estoy seguro de que he tropezado con alguna regla de sustitución de plantilla, le agradecería que alguien pudiera explicar cuál.
Este es un ejemplo simplificado. Estoy usando gcc:
template <typename U> string test(char(*)[sizeof(U::name)] = 0) { return "has name!"; }
template <typename U> string test(...) { return "no name"; }
struct HasName { string name; }
struct NoName {}
cout << "HasName: " << test<HasName>(0) << endl; //fine
cout << "NoName: " << test<NoName>(0) << endl; //compiler errors:
//error: size of array has non-integral type `<type error>'
//error: `name' is not a member of `NoName'
¿Qué compilador estás usando? g ++ 4.4.3 acepta este código y no emite diagnósticos incluso con '-Wall -Wextra -pedantic'. –
@Tyler: ¿no emite diagnósticos para los puntos y comas que faltan después de las definiciones 'struct'? ;-) –
oops :-); Estoy seguro de que sí (disculpe el tipeo descuidado) –