2010-11-21 11 views
5

¿Alguien podría decirme por qué esto no funciona?Plantilla especializada para enum

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<class T> 
struct X; 

template<> 
struct X<CompCriteria> 
{ 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    X<CompCriteria::ByeKeyAndValue> x; 
    return 0; 
} 

Respuesta

2

Usted se ha especializado X para un tipo, pero intenta usarlo con el número entero CompCriteria::ByeKeyAndValue.

Usted puede especializarse clase de plantilla para el tipo subyacente enum CompCriteria - int en este caso, de la siguiente manera:

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<int> 
struct X; 

template<> 
struct X<ByeKeyAndValue> 
{ 
}; 

int main() 
{ 
    X<ByeKeyAndValue> x; 
    return 0; 
} 
+0

gracias, funciona; –

2

Si usted tiene un template<class T> = template<typename T>, entonces se espera T para ser, también, un tipo .

enum CompCriteria es un tipo, por lo que puede instanciar esa plantilla con ella. Sin embargo, un valor único de la enumeración no es un tipo, por lo que no puede.

2
enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<CompCriteria crit_> 
struct X 
{ 
    static const CompCriteria crit = crit_; 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    X<CompCriteria::ByeKeyAndValue> x; 
    return 0; 
} 
+0

@Someone_who_downwoted ¿por qué está mal con esta respuesta? Al menos tenga agallas y explique por qué ha votado negativamente esta respuesta. +1 de mí porque me parece útil esta respuesta y AFAIC es lo que quería. –

+0

gracias por su respuesta. Lo probé y es exactamente lo que quería. Muchas gracias. –

+0

@Alexey Malistov Gracias por la respuesta. realmente útil. votó positivamente. ¿Puede mencionar esta línea? plantilla ¿qué regla de plantilla de C++ subyace a esto? –

9

Estás confundir la idea de parametrizados tipos y parametrizados valores. Un parámetro de plantilla puede ser un tipo o una constante. Por ejemplo:

template <typename T> 
struct Foo; 

frente ..

template <int N> 
struct Foo; 

Parece que desea especializarse su plantilla basada en una enumeración constante, en lugar de un tipo. Es decir, que tiene que decir:

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<CompCriteria> 
struct X; 

// Specialization for ByKeyAndValue 
// 
template<> 
struct X<ByeKeyAndValue> 
{ 
}; 

int main() 
{ 
    X<ByeKeyAndValue> x; // instantiate specialization 
    return 0; 
} 

Además, no se puede hacer referencia a las enumeraciones utilizando el operador de namespace. Si desea encapsular sus enumeraciones, debe envolverlas en un espacio de nombres:

namespace CompCriteria 
{ 
    enum type {ByKey,ByValue,ByeKeyAndValue}; 
} 
+0

Gracias una gran respuesta +1 –

Cuestiones relacionadas