Heim > Backend-Entwicklung > C++ > Warum schlägt die explizite Spezialisierung von Klassenmitgliedern außerhalb eines Namespace in C fehl?

Warum schlägt die explizite Spezialisierung von Klassenmitgliedern außerhalb eines Namespace in C fehl?

Susan Sarandon
Freigeben: 2024-12-06 04:49:21
Original
235 Leute haben es durchsucht

Why Does Explicit Specialization of Class Members Fail Outside a Namespace in C  ?

Explizite Spezialisierung außerhalb des Namespace-Geltungsbereichs: Ein Fehler in der nicht standardmäßigen G

C-Vorlagenprogrammierung beinhaltet die explizite Spezialisierung von Klassenmitgliedern für effizienten Code Generation. Die Platzierung expliziter Spezialisierungen ist jedoch entscheidend, wie das folgende Code-Snippet zeigt:

template<typename T>
class CConstraint
{
    // ...

    template <typename TL>
    void Verify(int position, int constraints[])
    {
    }

    template <>
    void Verify<int>(int, int[])
    {
    }
};
Nach dem Login kopieren

Beim Kompilieren mit g führt dieser Code zu dem Fehler:

Explicit specialization in non-namespace scope 'class CConstraint'
Nach dem Login kopieren

Zum Verständnis Um diesen Fehler zu beheben, müssen wir den C-Standard untersuchen, der vorschreibt, dass explizite Spezialisierungen innerhalb des Namespace deklariert werden müssen, dessen Mitglied die Vorlage ist. Im obigen Beispiel wird CConstraint in keinem Namespace deklariert und daher ist die explizite Spezialisierung von Verify ist ungültig.

VC-Compiler sind in diesem Fall jedoch nicht konform und erlauben explizite Spezialisierungen außerhalb des Namespace-Bereichs. Dieses Verhalten ist nicht standardmäßig und sollte nicht als verlässlich angesehen werden.

Lösung:

Um dieses Problem zu beheben und die Einhaltung des C-Standards sicherzustellen, müssen explizite Spezialisierungen deklariert werden innerhalb desselben Namensraums wie die Vorlage, auf die sie spezialisiert sind. Hier ist eine korrigierte Version des Codes:

namespace MyNamespace
{
    template<typename T>
    class CConstraint
    {
        // ...

        template <typename TL>
        void Verify(int position, int constraints[])
        {
        }

        template <>
        void Verify<int>(int, int[])
        {
        }
    };
}
Nach dem Login kopieren

Durch die Kapselung von CConstraint innerhalb des MyNamespace-Namespace stellen wir sicher, dass seine expliziten Spezialisierungen auch innerhalb dieses Namespace deklariert werden, wodurch der Kompilierungsfehler behoben wird.

Da C 03 außerdem die Spezialisierung von Mitgliedsfunktionen ohne explizite Spezialisierung der enthaltenden Klasse verbietet, könnten wir auch die Verwendung eines Ansatzes mit freien Funktionen in Betracht ziehen, wie im bereitgestellten Vorschlag vorgeschlagen Antwort:

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);
    }
};
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum schlägt die explizite Spezialisierung von Klassenmitgliedern außerhalb eines Namespace in C fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage