Ich möchte eine Vorlage erstellen, die nur bestimmte Typparameter akzeptiert. Für alle verbleibenden Typen möchte ich eine Kompilierzeit-Fehlermeldung ausgeben. Also schreibe ich folgendesSo schränken Sie Vorlagenparameter ein
------ ------ Version 1
template <typename T_,bool isError = true>
struct Error {
static_assert(!isError, "Invalid Type");
};
template <typename T_>
struct Wrapper : Error <T_> {
private:
T_ value_;
};
template <>
struct Wrapper<int> : Error<int, false> {
private:
int value_;
};
int main()
{
Wrapper<int> wi;
Wrapper<long> wl; // I get the Invalid Type.
}
Da ich nicht Typparameter T_
verwenden habe ich es entfernt haben und der Code funktioniert nicht mehr.
------ ------ Version 2
template <bool isError = true>
struct Error {
static_assert(!isError, "Invalid Type");
};
template <typename T_>
struct Wrapper : Error <> {
private:
T_ value_;
};
template <>
struct Wrapper<int> : Error<false> {
private:
int value_;
};
int main()
{
Wrapper<int> wi; // I get Invalid type ?????
Wrapper<long> wl; // I get the Invalid Type.
}
Meine Fragen sind. Warum passiert das, nachdem das Argument type entfernt wurde? Ist diese Lösung "sauber"? Oder gibt es bessere Möglichkeiten, meine Absichten zu erreichen?
Sie Fehler bekam auch ohne 'wi/wl'. Weil 'Error*true*/>' instanziiert wird. – Jarod42
Wenn Sie 'T_' entfernen, ist die Basisklasse' Error <> 'für die primäre 'Wrapper'-Vorlage nicht mehr vom Template-Parameter abhängig, sodass sie instanziiert wird, ohne' Wrapper' selbst zu instanziieren. Wie Jarod darauf hinweist, wirst du auf den Fehler stoßen, selbst wenn du ein leeres 'main' hast. –
Praetorian