2011-09-12 15 views
6

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.

+1

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

+3

@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

+0

@Nawaz Thanks :) – AraK

Respuesta

2

Verificar el tema '3.1 Activación de especializaciones clase de plantilla' en http://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

Editar: especializaciones de clase en caso de enlace boost.org muere ...

3.1 Activación plantilla especializaciones plantilla de clase se puede activar o desactivado con enable_if. Se debe agregar un parámetro de plantilla adicional para las expresiones habilitadoras. Este parámetro tiene el valor predeterminado vacío. Por ejemplo:

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> { ... }; 

instancias de un con cualquier tipo integral coincide con la primera especialización, mientras que cualquier tipo de punto flotante coincide con la segunda. Todos los demás tipos coinciden con la plantilla principal. La condición puede ser cualquier expresión booleana en tiempo de compilación que dependa de los argumentos de plantilla de la clase. Tenga en cuenta que una vez más, el segundo argumento para enable_if no es necesario; el valor predeterminado (nulo) es el valor correcto.

+2

Por favor, publique las respuestas completas, ya que las suyas son inútiles si el enlace muere ... –

+0

Dudo mucho que un enlace a boost.org se muera, pero de todos modos publicaré una respuesta completa. –

+2

Yo también, aunque ya reorganizaron su sitio una vez en el pasado :) –

Cuestiones relacionadas