2010-11-21 25 views
5

Qualcuno potrebbe dirmi perché questo non funziona?Modello di specializzazione per 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; 
} 

risposta

2

Si è specializzato X per un tipo, ma si sta tentando di utilizzarlo con il numero intero CompCriteria::ByeKeyAndValue.

È possibile specializzarsi classe template per il tipo sottostante enum CompCriteria - int in questo caso, come segue:

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<int> 
struct X; 

template<> 
struct X<ByeKeyAndValue> 
{ 
}; 

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

grazie, funziona; –

2

Se si dispone di un template<class T> = template<typename T>, allora T dovrebbe essere, beh, un tipo.

enum CompCriteria è un tipo, quindi è possibile creare un'istanza con tale modello. Un singolo valore dell'enumerazione, tuttavia, non è un tipo, quindi non è possibile.

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 perché cosa c'è di sbagliato in questa risposta? Almeno avere coraggio e spiegare perché hai downvoted questa risposta. +1 da parte mia perché trovo questa risposta utile e AFAIC è ciò che volevo. –

+0

grazie per la tua risposta - l'ho provato ed è esattamente quello che volevo. Grazie tante. –

+0

@Alexey Malistov Grazie per la risposta. davvero utile ... up-votato. Per favore, menziona questa linea - template quale regola di template C++ dietro questo? –

9

Stai confondendo l'idea di parametri tipi e parametrizzato valori. Un parametro modello può essere un tipo o una costante. Per esempio:

template <typename T> 
struct Foo; 

contro ..

template <int N> 
struct Foo; 

Sembra che si desidera specializzarsi vostro modello basato su un enum costante, piuttosto che un tipo. Significato, è necessario dire:

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

Inoltre, non è possibile fare riferimento al enumerazioni usando l'operatore namespace. Se vuoi incapsulare le tue enumerazioni, devi raggrupparle in uno spazio dei nomi:

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

Grazie grande risposta +1 –

Problemi correlati