2010-11-21 5 views
5

Kann mir jemand sagen, warum das nicht funktioniert?Spezialisierungsvorlage für 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; 
} 

Antwort

2

Sie haben sich für einen Typ auf X spezialisiert, aber Sie versuchen, ihn mit der Ganzzahl CompCriteria::ByeKeyAndValue zu verwenden.

enum CompCriteria{ByKey,ByValue,ByeKeyAndValue}; 

template<int> 
struct X; 

template<> 
struct X<ByeKeyAndValue> 
{ 
}; 

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

danke, es funktioniert; –

2

Wenn Sie ein template<class T> = template<typename T>, dann wird T zu erwarten sein, na ja, ein Typ.

enum CompCriteria ist ein Typ, so dass Sie diese Vorlage instanziieren können. Ein einzelner Wert der Enumeration ist jedoch kein Typ, Sie können also nicht.

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 warum ist was mit dieser Antwort falsch? Haben Sie wenigstens Mut und erklären Sie, warum Sie diese Antwort abgelehnt haben. +1 von mir für ich finde diese Antwort hilfreich und AFAIC es ist was ich wollte. –

+0

Vielen Dank für Ihre Antwort - Ich habe es versucht und es ist genau das, was ich wollte. Vielen Dank. –

+0

@Alexey Malistov Vielen Dank für die Antwort. wirklich hilfreich .. up-voting.Can Sie bitte erwähnen Sie diese Zeile - Vorlage Welche C++ Vorlage Regel dahinter? –

9

Sie die Idee der parametrisierte Typen und parametriert Werte conflating: int in diesem Fall wie folgt -

Sie können Template-Klasse für die enum CompCriteria zugrunde liegenden Typ spezialisiert haben. Ein Vorlagenparameter kann ein Typ oder eine Konstante sein. Zum Beispiel:

template <typename T> 
struct Foo; 

gegen ..

template <int N> 
struct Foo; 

Es ist wie Sie basiert auf einer Enum konstant, sondern als eine Art wollen sich spezialisieren Ihre Vorlage aussieht. Das heißt, müssen Sie sagen:

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

Außerdem können Sie nicht auf Aufzählungen verweist den namespace Operator. Wenn Sie Ihre Enums kapseln möchten, müssen Sie sie in einen Namespace einbinden:

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

Danke gute Antwort +1 –