2015-02-14 21 views
6

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(){} 

CLANG

G++

Und das kompiliert sowohl Klirren und gcc in Ordnung. Könnten Sie mir erklären, was das bedeutet?

+0

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

+0

@dyp Vorwärtsreferenzen abgedeckt sind keine Seltenheit in der Norm. – Columbo

+0

@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

Antwort

3
template <class U> 
struct A 
{ 
    template<class T> 
    void foo(); 
}; 

Wie Sie sehen können, die Erklärung ist void foo();, die eine gültige Funktionsdeklaration ist. So ist der erste Aufzählungspunkt gilt:

Die Erklärung in einer template-Deklaration wird

  • declare oder eine Funktion definieren, eine Klasse oder eine Variable oder
  • a definieren, Elementfunktion, eine Memberklasse, eine Memberenumeration oder ein statisches Datenelement einer Klassenvorlage oder einer Klasse, die innerhalb einer Klassenvorlage verschachtelt ist, oder

Mitgliedsfunktionen sind in der genannten zweiten Kugel lediglich zu betonen, dass

template<class T> 
void A<T>::foo() {} 

gültig ist; Die Deklaration in dieser Vorlage-Deklaration (void A<T>::foo() {}) ist eine Memberfunktionsdefinition. Das "oder" ist nicht exklusiv, da die obige Deklaration immer noch eine Funktionsdefinition ist.

Es wird nun klar, dass dies nur Definitionen betreffen, da

template<class T> 
void A<T>::foo(); 

ohnehin nicht gültig ist.

+0

Danke, es verdeutlicht das Verhalten. –

Verwandte Themen