2010-05-18 9 views
26

Un costruttore di una classe può essere una funzione di modello. Nel punto in cui viene chiamato un tale costruttore, il compilatore di solito esamina gli argomenti forniti al costruttore e determina da essi i parametri del modello utilizzato. C'è anche qualche sintassi per specificare esplicitamente i parametri del template?I parametri del modello di un costruttore possono essere specificati in modo esplicito?

Un esempio inventato:

struct A { 
    template<typename T> 
    A() {} 
}; 

C'è un modo per creare un'istanza di questa classe? Qual è la sintassi per specificare in modo esplicito i parametri del modello del costruttore?

Il mio caso d'uso sarebbe un problema se il compilatore non sembra trovare il costruttore di modello corretto. Specificando in modo esplicito i parametri del modello probabilmente genererebbe più messaggi di errore utili o addirittura risolvere il problema.

+1

La specifica esplicita degli argomenti del modello per i costruttori funziona solo nelle specializzazioni esplicite, nelle istanze, nelle definizioni fuori linea e nelle dichiarazioni di amicizia del costruttore. –

+0

'modello struct A { modello A() {} };' - funziona bene per me. Ma ovviamente ora abbiamo template class. – bruziuz

risposta

32

No. Lo standard C++ 03 dice:

[Nota: perché l'elenco modello argomento esplicito segue il nome del modello di funzione, e perché i modelli di funzione membro di conversione e modelli di funzione di membro del costruttore sono chiamati senza utilizzando un nome di funzione, non v'è alcun modo per fornire un elenco di argomenti modello esplicita per questi modelli di funzione.] (§14.5.2/5)

3

no, non è possibile creare un'istanza di quella classe utilizzando tale costruttore. MA:



struct A 
{ 
    template < typename T > 
    A(T const&); 
}; 

Ora è possibile.

+3

Non capisco la risposta ... come è correlata alla domanda? –

+2

Mostra come puoi farlo. Succede solo che non puoi farlo nel modo in cui la domanda è stata posta. – MSN

+0

I commenti troppo negativi non possono essere abbassati di livello. Quello è lontano dal "grande". –

8

c'è un'altra soluzione per informazioni sul tipo che trasferiscono ai costruttori, i quali possono' t prendere un valore di questo tipo come un argume nt:

template<class T> 
struct id 
{}; 

struct A { 
    template<class T> 
    A(id<T>); 
}; 

A a=id<int>(); 

Edit:

Si prega di notare: A a(id<int>()); non funziona, a causa della parse più fastidioso. Sarebbe interpretato come una dichiarazione di funzione. Vedi this question per ulteriori spiegazioni.

Problemi correlati