Heim > Backend-Entwicklung > C++ > Warum führt die explizite Spezialisierung einer Mitgliedsfunktion außerhalb ihres Namespace zu einem C-Kompilierungsfehler?

Warum führt die explizite Spezialisierung einer Mitgliedsfunktion außerhalb ihres Namespace zu einem C-Kompilierungsfehler?

Susan Sarandon
Freigeben: 2024-12-04 11:56:11
Original
692 Leute haben es durchsucht

Why Does Explicit Specialization of a Member Function Outside its Namespace Cause a C   Compilation Error?

Explizite Spezialisierung im Nicht-Namespace-Bereich

In der Vorlagenklasse CConstraint wird eine explizite Spezialisierung der Verify-Memberfunktion für int außerhalb des Namespace der Klasse definiert. Dies führt zu einem Fehler in g aufgrund eines Verstoßes gegen C-Standards.

Gemäß C 03 §14.7.3/2 müssen explizite Spezialisierungen in dem Namensraum deklariert werden, dessen Mitglied die Vorlage ist, oder für Mitglied Vorlagen, in deren Namensraum die umschließende Klasse oder die umschließende Klassenvorlage Mitglied ist.

Um dieses Problem zu beheben, ist die explizite Spezialisierung von Verify for int muss innerhalb des Namespace von CConstraint deklariert werden. Dies kann durch die Verwendung des folgenden modifizierten Codes erreicht werden:

<br>template<typename T><br>class CConstraint<br>{<br>public:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">CConstraint()
{
}

virtual ~CConstraint()
{
}

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

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

};

Darüber hinaus erfordern explizite Spezialisierungen von Mitgliedsfunktionen eine explizite Spezialisierung der enthaltenden Klasse , wäre eine bessere Lösung, die Verify-Funktion aus der Klasse in eine separate zu verschieben Namespace:

<br>Namespace-Detail<br>{</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">template <typename TL>
void Verify(int position, int constraints[]) { }

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

}

template
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 führt die explizite Spezialisierung einer Mitgliedsfunktion außerhalb ihres Namespace zu einem C-Kompilierungsfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Vorheriger Artikel:Warum funktioniert die unqualifizierte Namenssuche nicht mit vorlagenparameterabhängigen Basisklassen in C? Nächster Artikel:Warum gibt „tellg()“ manchmal eine falsche Dateigröße zurück?
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
Aktuelle Ausgaben
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage