14/1 [temp]
bietet:Unklare Formulierung über Erklärung in template-Erklärung
Die Deklaration in einer Vorlage-Erklärung wird
(1,1) - erklären oder eine Funktion, eine Klasse definieren, oder eine Variable, oder
(1,2) - eine Elementfunktion definieren, ein Mitglied der Klasse, ein Mitglied Aufzählung oder ein statisches Datenelement einer Klasse-Vorlage oder eine Klasse innerhalb einer Klasse Vorlage verschachtelt oder
(1.3) - Definieren Sie eine Elementvorlage einer Klassen- oder Klassenvorlage oder
(1.4) - eine Alias-Deklaration sein.
Das zweite Aufzählungszeichen ist unklar, weil es so aussieht, als ob wir kein Mitglied der Klassenvorlage deklarieren und nicht definieren können. Aber eigentlich können wir das tun:
template <class U>
struct A
{
template<class T>
void foo();
};
int main(){}
Und das kompiliert sowohl Klirren und gcc in Ordnung. Könnten Sie mir erklären, was das bedeutet?
In 'Vorlage void my_class :: mf() {}', ist 'void my_class :: mf() {}' schon die Definition einer Elementfunktion in diesem Abschnitt? Das mag seltsam klingen, aber 'T' ist ein neues Element in dieser Erklärung (die Angabe, was ein * Template-Parameter * ist folgt in 14.1), die nicht durch die normalen Regeln Erklärung AFAIK abgedeckt ist. OTOH, 'void foo()' ist eine „normale“ Funktionsdeklaration, auch wenn es innerhalb einer Klasse auftritt, so dass ich denke, dass Ihr Beispiel um 1,1 –
dyp
@dyp Vorwärtsreferenzen abgedeckt sind keine Seltenheit in der Norm. – Columbo
@Columbo Könnte 1.2 beziehen sich auf 'template template Lücke A :: B :: foo() {}', wo das Teil 'template Lücke A :: B :: foo() {} ist' * nicht * eine Funktionsdefinition, aber eine Template-Deklaration (also gilt 1.1 nicht)? Diese Template-Deklaration definiert * keine * Member-Templates, daher gilt auch 1.3 nicht. –
dyp