2016-09-14 5 views
1

Ich habe folgenden CodeReferenz für Template-Parameter verwendet

using namespace std; 
#include <iostream> 

template<typename a> struct function 
{ 
    void self1(){ cout << "hello world 1111" << endl; } 
}; 

template<typename a> struct function<a&> 
{ 
    void self2() { cout << "hello world 2222" << endl; } 
}; 


int main() 
{ 
    function<int> a; 
    a.self1(); 
    function<int&> b; 
    b.self2(); 
    return 0; 
} 

Das Ergebnis läuft:

hellow world 1111 
heloow world 2222 

Möchten die Beziehung Schiff zwischen der ersten „struct-Funktion“ stellen und der zweiten „struct Funktion "

Wird die zweite als" Template-Spezialisierung "für die erste klassifiziert? (scheint nicht)

Ich kann sehen, dass die zweite basiert auf der ersten basiert. (Durch Entfernen des ersten ist es nicht kompilierbar). Aber

b.self1() is not defined. 

Also irgendwie die zweite haben die Struktur zu einem neuen umdefiniert?

+0

Ja, das ist Template-Spezialisierung. –

+0

@GillBates Thx, mein übliches Verständnis ist, dass Template-Spezialisierung würde den Typ zu bool/int und so weiter definieren. Jetzt ist es als Referenz definiert. Ich werde mehr in das Wissen schauen. – thundium

Antwort

1

Ich kann sehen, dass die zweite basiert auf der ersten basiert. (Durch Entfernen der ersten, ist es nicht kompilierbar). Aber

b.self1() ist nicht definiert. Also irgendwie die 2nd haben die Struktur zu einer neuen definiert?

function ist eine Strukturvorlage, es ist keine Struktur für sich. Im Moment der Instanziierung eines wie Sie getan: function<int> a; generiert der Compiler eine struct function_int, die int für alle T's (oder a's in diesem Fall) enthält.

template<typename a> struct function<a&> 

Dies ist eine Spezialisierung der Struktur-Vorlage, die für wenn a ist ein Referenztyp verwendet wird. Diese Spezialisierung kann keine Member/Methoden der "originalen" Strukturvorlage verwenden.

+0

Was bedeutet es, dass die Spezialisierung nichts mit der primären Vorlage teilt? Es ist eine Spezialisierung, es würde nicht kompilieren, wenn die primäre Vorlage nicht existiert. Ist es nicht genug? – skypjack

+0

@Skypjack In dieser Spezialisierung kann man 'self1()' nicht verwenden. –

+0

Ich verstehe deinen Standpunkt. Nun, eigentlich _share nothing_ ist nicht der beste Weg, das zu sagen. Meine zwei Cent. :-) – skypjack

Verwandte Themen