2012-06-27 12 views
8

Ho questo codice:Parametri del modello predefinito: perché il compilatore si lamenta di non specificare l'argomento del modello?

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

Se faccio foo() in funzione modello con lo stesso modello di 'firma', il compilatore non lamentarsi di non specificare gli argomenti di modello:

struct A {}; 

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

B b; //OK 
b.foo() 

Quindi, perché devo specificare un argomento per una classe template con un parametro predefinito, ma non per una funzione template? C'è qualche sottigliezza che mi manca?

Il motivo è a causa di errore di deduzione argomento modello di sicuro. Ma voglio sapere perché.

+0

C'è una parola mancante nel titolo di questa domanda? – Pointy

+0

Sì. Manca la parola - si lamentano. Aggiunto. – badmaash

+0

Possibile duplicato di * [argomenti modello predefiniti per modelli di funzioni] (http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates) *. –

risposta

7

La sintassi corretta è questa (demo):

B<> b; 

L'argomento default A si presume per il modello di classe B. La parte <> dice al compilatore che B è un modello di classe e chiede di prendere il parametro predefinito come argomento del modello.

+0

Vedo. Ma perché la funzione template funziona senza questo: 'b.foo <>()'? – badmaash

+1

@badmaash: ciò non funziona: http://ideone.com/QhWgJ – Nawaz

+0

Il mio male. Dovrebbe aver menzionato g ++ 4.7.0 che supporta i parametri predefiniti del template per le funzioni. Quindi il codice sopra funziona sicuramente. Prova a girare con g ++ 4.7.0. – badmaash

0

Perché devi dire che B è un modello:

B<> b; 

Anche quando non si desidera specificare uno qualsiasi degli argomenti.

+0

In realtà è necessario '<>' per dire al compilatore che non si desidera un modello, ma l'istanziazione di un modello con l'argomento predefinito. La sintassi è corretta però. –

1

La sintassi corretta, come Nawaz accenna già è:

B<> b; 

La ragione è che B è il modello e B<> è l'esemplificazione del modello con l'argomento di default A. Ma è necessario che lo <> si distingua quando si desidera un'istanza.

Problemi correlati