2017-10-27 3 views
1

Sorry, dass ich ein Anfänger der C++ Programmierung bin.C++ Typ Argumente sind in der Vorlage Deklaration weggelassen. Wie wäre es jedoch mit der Definition der Mitgliedsfunktion?

Wie ich weiß, die type Argumente in der Vorlage Deklaration kann weggelassen werden. Zum Beispiel

template<typename T> 
class A{ 
A<T> func(A<T> t); 
} 

als

template<typename T> 
class A{ 
A func(A t) {} 
} 

auch geschrieben werden, ich weiß, dass, wenn die Mitgliederfunktionen außerhalb der Klasse definiert sind, können die Typargumente nicht verzichtet werden. Ich habe jedoch festgestellt, dass das Argument type im Argumenttyp der Funktion ebenfalls weggelassen werden kann. Warum ist es so?

meine ich für

A<T> A<T>:: func(A<T> t) {} 

warum Sie den Code unten zulässig ist, auch wenn es außerhalb der Template-Deklaration ist?

A<T> A<T>:: func(A t) {} 
+0

Das "Duplikat" beantwortet diese Frage nicht. OP ist sich bewusst, dass der injizierte Klassenname existiert, die Frage ist, warum er außerhalb des Klassenkörpers arbeitet. – Quentin

+0

Oh sorry diejenigen A A :: func sein sollte (A t) {} und A A :: func (A t) {} –

+0

Ungefähr, der Compiler liest Code von links nach rechts. Wenn es 'A ::' sieht, weiß es, dass wir wieder in 'A ' sind, also kann man annehmen, dass ein 'A' ohne Parameter wirklich' A 'bedeutet. –

Antwort

2

Der Grund dieser Arbeiten ist, weil A<T>:: die Deklaration Scopes - alles, was er weiß, über den Inhalt der A<T>, einschließlich der injizierten Klassennamen A folgt. Dies ist auch streng in der Reihenfolge des Quellcodes, was zu der folgenden Neugier zwischen zwei semantisch identische Definitionen führt:

A A<T>::func(A t) {} // Doesn't work -- `A` is not known before `A<T>::` 

auto A<T>::func(A t) -> A {} // Works, because the return type is after `A<T>::`! 
+0

Welcher, IIRC, war ein großer Grund für die Einführung der 'auto f (args) -> type'-Syntax. –

+0

@DanielH Es wird auch sehr geschätzt, wenn Sie die Parameter im Rückgabetyp verwenden möchten, z. 'Vorlage automatisch f (Ta, Ub) -> Dekltyp (a + b)'. – Quentin

+0

Ich betrachtete das aus dem gleichen Grund, aber ein Beispiel dafür, wo es nützlicher ist. Dadurch wird der Rückgabetyp an einen Punkt gesetzt, an dem sich mehr Dinge befinden. Sie können also 'A' oder' declltype (a + b) 'anstelle von' A 'oder' declltype (declval () + declval ) verwenden()) '. –

Verwandte Themen