2016-05-25 8 views
2

Ich versuche, eine partielle Spezialisierung für ganzzahlige Typen zu erstellen. Meine Idee war, etwas Ähnliches zu tun:Warum kann enable_if nicht für spezielle Parameter verwendet werden?

#include <type_traits> 

template <typename T> 
struct Class { 
}; 

template <typename T> 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
}; 

Dies führt jedoch zu dem folgenden Fehler:

error: template parameters not deducible in partial specialization: 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
    ^
note: 'T' 

Es funktioniert, wenn ich einen zusätzlichen Template-Parameter:

#include <type_traits> 

template <typename T, typename Enable = void> 
struct Class { 
}; 

template <typename T> 
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> { 
}; 

Warum Brauche ich den zusätzlichen Vorlagenparameter?

Antwort

3

Im ersten Fall sind Sie nicht die Klasse spezialisiert. Wenn Sie schreiben:

template <typename T> 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
}; 

dass T noch ein generischer Template-Typ ist, und die Compiler verwechselt wird.

Im zweiten Fall, wenn Sie

template <typename T> 
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> { 
}; 

Sie richtig darauf spezialisiert, den Template-Parameter Enable, und alles funktioniert gut schreiben.

Wenn Sie die erste spezialisieren wollen, sollten Sie es nach Typ Typ tun, das ist wahrscheinlich nicht das, was Sie wollen

template <> 
struct Class<std::enable_if<std::is_integral<int>::value, int>::type> { 
}; 
+0

aber nicht die Spezialisierung auch Klasse lösen? Ich kann nicht verstehen, wie dieser zweite Fall dem Compiler klar ist. –

+0

Sie brauchen nicht unbedingt 'Enable = void', lassen Sie es aus und es sollte auch gut funktionieren. 'template ' sollte den Trick machen –

+1

Ah! Jetzt sehe ich! Der Basisfall ist die Klasse . Die Spezialisierung ist Klasse , daher ist der Vorlagenparameter E jetzt spezialisiert. Ohne E würde der Compiler denken, dass es keine partielle Spezialisierung in Aktion gibt (die Spezialisierung hat denselben Typ wie der Basisfall). Danke, dass du dieses Licht beleuchtet hast! –

Verwandte Themen