Explizite Spezialisierung im Nicht-Namespace-Bereich
Abfrage:
In einer C-Vorlagenklasse CConstraint, warum generiert der Compiler den Fehler „Explizite Spezialisierung im Nicht-Namespace-Bereich“, wenn eine Mitgliedsfunktion explizit ist spezialisiert?
Antwort:
Das Problem tritt auf, weil die explizite Spezialisierung in CConstraint nicht innerhalb eines Namespace deklariert ist. Gemäß dem C 03-Standard, Abschnitt 14.7.3/2, müssen explizite Spezialisierungen im Namensraum der Vorlage oder bei Mitgliedsvorlagen im Namensraum der umschließenden Klasse oder Klassenvorlage liegen.
Außerdem Abschnitt C 03 14.7.3/3 schränkt die explizite Spezialisierung von Mitgliedsfunktionen ein, es sei denn, die enthaltende Klasse selbst ist dies explizit spezialisiert.
Lösung:
Um dieses Problem zu lösen, besteht ein Ansatz darin, die Verify()-Mitgliedsfunktion an eine spezialisierte freie Funktion weiterzuleiten, die in einem separaten Namespace definiert ist, z unten dargestellt:
namespace detail { template <typename TL> void Verify(int, int[]) {} template <> void Verify<int>(int, int[]) {} } template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); } };
Das obige ist der detaillierte Inhalt vonWarum verursacht die explizite Spezialisierung einer Mitgliedsfunktion in einer C-Vorlagenklasse den Fehler „Nicht-Namespace-Bereich'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!