Heim >Backend-Entwicklung >C++ >Warum verursacht die explizite Spezialisierung einer Mitgliedsfunktion in einer C-Vorlagenklasse den Fehler „Nicht-Namespace-Bereich'?

Warum verursacht die explizite Spezialisierung einer Mitgliedsfunktion in einer C-Vorlagenklasse den Fehler „Nicht-Namespace-Bereich'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-04 06:15:171051Durchsuche

Why Does Explicit Specialization of a Member Function in a C   Template Class Cause a

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn