2012-06-27 10 views
8

Ich habe diesen Code:Default-Template-Parameter: Warum beschwert sich der Compiler, Template-Argument nicht anzugeben?

struct A{}; 

template<class T = A> 
struct B { 
    void foo() {} 
}; 

B b; //Error: missing template arguments before 'b' 
    //Error: expected ';' before 'b' 
    //More errors 
b.foo() 

Wenn ich foo() als Template-Funktion mit der gleichen Vorlage 'Signatur' zu machen, der Compiler beschwert sich nicht über die Vorlage nicht Argumente spezifizieren:

struct A {}; 

struct B { 
    template<class T = A> 
    void foo() {} 
}; 

B b; //OK 
b.foo() 

Also, warum muss ich ein Argument für eine Template-Klasse mit einem Standard-Parameter angeben, aber nicht für eine Template-Funktion? Gibt es etwas Subtilität, die ich vermisse?

Der Grund ist wegen der Vorlage Argumentabzugsfehler sicher. Aber ich möchte wissen warum.

+0

Gibt es im Titel dieser Frage ein Wort? – Pointy

+0

Ja. Verpasste das Wort - beschweren. Hinzugefügt es. – badmaash

+0

Mögliches Duplikat von * [Standardvorlagenargumente für Funktionsvorlagen] (http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates) *. –

Antwort

7

Die korrekte Syntax ist dies (demo):

B<> b; 

Das Standardargument AB für die Klassenvorlage angenommen wird. Der <> Teil teilt dem Compiler mit, dass B eine Klassenvorlage ist und fordert ihn auf, den Standardparameter als Vorlageargument zu übernehmen.

+0

Ich sehe. Aber warum funktioniert die Template-Funktion ohne das: 'b.foo <>()'? – badmaash

+1

@badmaash: Das funktioniert nicht: http://ideone.com/QhWgJ – Nawaz

+0

Mein schlechtes. Sollte g ++ 4.7.0 erwähnt haben, das Standard-Template-Parameter für Funktionen unterstützt. Der obige Code funktioniert also definitiv. Versuchen Sie, mit g ++ 4.7.0 zu laufen. – badmaash

0

Weil man muss sagen, dass B eine Vorlage:

B<> b; 

Auch wenn Sie nicht wollen, eines der Argumente spezifizieren.

+0

Eigentlich brauchst du '<>', um dem Compiler zu sagen, dass du keine Vorlage willst, sondern die Instanziierung einer Vorlage mit dem Standardargument. Die Syntax ist jedoch korrekt. –

1

Die korrekte Syntax, wie Nawaz bereits erwähnt ist:

B<> b; 

Der Grund dafür ist, dass B die Vorlage und B<> ist die Instanziierung der Vorlage mit dem Standardargument A. Aber Sie müssen die <> unterscheiden, wenn Sie eine Instanziierung möchten.