„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum scheitert die explizite Spezialisierung von Mitgliedern der C ++ -Kläufe außerhalb des Namespace?

Warum scheitert die explizite Spezialisierung von Mitgliedern der C ++ -Kläufe außerhalb des Namespace?

Gepostet am 2025-04-18
Durchsuche:653

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

explizite Spezialisierung außerhalb des Namensspace Scope: Ein Fehler in nicht standardmäßigem G

c Vorlage Die Programmen von Vorlagen beinhaltet die explizite Spezialisierung von Klassenmitgliedern für effiziente Codegeneration. Die Platzierung explizite Spezialisierungen ist jedoch entscheidend, wie der folgende Code -Snippet zeigt:

template
class CConstraint
{
    // ...

    template 
    void Verify(int position, int constraints[])
    {
    }

    template 
    void Verify(int, int[])
    {
    }
};

, wenn mit g kompiliert wird, führt dieser Code in den Fehler:

Explicit specialization in non-namespace scope 'class CConstraint'

Um diesen Fehler zu verstehen, müssen wir das C-Standard untersuchen, was die explizite Spezialisierungen innerhalb des Namenspace des Namenspace des Vorschlags des Vorschlags des Vorschlags des Vorschlags, dessen Vorschriften eingestellt werden muss. Im obigen Beispiel wird die CConstraint in keinem Namespace deklariert, und daher ist die explizite Spezialisierung von verifizieren ungültig.

VC-Compiler sind jedoch in diesem Fall nicht konform, sodass explizite Spezialisierungen außerhalb des Namensspace-Bereichs ermöglichen. Dieses Verhalten ist nicht standardmäßig und sollte nicht verlassen werden.

Lösung:

, um dieses Problem zu lösen und die Einhaltung des C-Standards der C-Standard zu gewährleisten, muss explizite Spezialisierungen im selben Namespace als Vorlage deklariert werden, das sie spezialisiert haben. Hier ist eine korrigierte Version des Code:

namespace MyNamespace
{
    template
    class CConstraint
    {
        // ...

        template 
        void Verify(int position, int constraints[])
        {
        }

        template 
        void Verify(int, int[])
        {
        }
    };
}

Durch die Einzahlung von Cconstraint im ManameSpace -Namespace stellen wir sicher, dass seine explizite Spezialisierungen auch in diesem Namespace deklariert werden, wobei der Kompilierungsfehler behoben wird. Antwort:

Namespace Detail { Vorlage void verifizieren (int, int []) {} Vorlage void verifizieren (int, int []) {} } Vorlage Klasse cconstraint { // ... Vorlage void verifizieren (int Position, int -Einschränkungen []) { Detail :: Überprüfung (Position, Einschränkungen); } };

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3