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[]) { }
};
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[]) { }
}
template
class CConstraint
{
// ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); }
};
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!