Explizite Spezialisierung von Template-Funktionen in Template-Klassen: Syntax-Rätsel in C
Der angegebene Codeausschnitt veranschaulicht ein Programmierrätsel, das beim Versuch auftritt spezialisieren Sie explizit eine Vorlagenfunktion innerhalb einer Vorlagenklasse. In Microsoft Visual C 2008 (VC9) wird der Code erfolgreich kompiliert; Beim Kompilieren mit GCC 4.2 auf einem Mac tritt jedoch beim gleichen Code ein Fehler auf.
GCC erfordert die Deklaration expliziter Spezialisierungen außerhalb der Klasse, die korrekte Syntax hierfür ist jedoch unklar. Der anfängliche Versuch, die explizite Spezialisierung außerhalb der Klasse zu platzieren, wie unten gezeigt, ist falsch:
template< typename T > template<> inline void C< T >::f< tag >( T ) {}
Der richtige Ansatz besteht darin, Aufrufe an eine Mitgliedsfunktion eines teilweise spezialisierten Typs weiterzuleiten. Hier ist der korrigierte Code:
template<class T, class Tag> struct helper { static void f(T); }; template<class T> struct helper<T, tag1> { static void f(T) {} }; template<class T> struct C { // ... template<class Tag> void foo(T t) { helper<T, Tag>::f(t); } };
Diese Änderung führt eine Hilfsstruktur ein, die die gewünschte Funktionalität bereitstellt und gleichzeitig die Syntaxanforderungen von GCC einhält. Durch die Trennung der expliziten Spezialisierung von der Klasse selbst wird der Code erfolgreich kompiliert und funktioniert wie erwartet.
Das obige ist der detaillierte Inhalt vonWie kann man Template-Funktionen innerhalb von Template-Klassen in C explizit explizit spezialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!