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?
aber nicht die Spezialisierung auch Klasse lösen? Ich kann nicht verstehen, wie dieser zweite Fall dem Compiler klar ist. –
Sie brauchen nicht unbedingt 'Enable = void', lassen Sie es aus und es sollte auch gut funktionieren. 'template' sollte den Trick machen –
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! –