Estoy tratando de especializarse en parte un rasgo para las matrices de caracteres no-:heredando de una base enable_if'd
template<typename T>
struct is_container : std::false_type {};
template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};
Visual Studio 2010 me da un C2039 (type
sin elemento alguno de enable_if
...) Sin embargo, ¿no debería SFINAE simplemente tocar fondo aquí en lugar de dar un error de compilación? ¿O no aplica SFINAE en este caso?
Por supuesto que podría simplemente separar las especializaciones de la no-char y Char:
template<typename T>
struct is_container : std::false_type {};
template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};
template<unsigned N>
struct is_container<char[N]> : std::false_type {};
Pero realmente me gustaría saber por qué SFINAE no funciona en este caso particular.
Bueno, creo que 'typename' es necesario en frente de' std :: enable_if', debido al tipo de dependiente pero no lo pondría como respuesta porque esto es solo especulación. – AraK
@Arak: No. 'typename' no es necesario en ese contexto. Al buscar la clase base, el compilador excluye todos los no tipos al principio. Vea esto: http://stackoverflow.com/questions/4347730/use-of-typename-keyword-with-template-function-parameters – Nawaz
@Nawaz Thanks :) – AraK