2010-05-07 13 views

risposta

35

Non è possibile. Lo Standard ha anche una nota su questo a 14.8.1/7

[Nota: perché l'elenco modello argomento esplicito segue il nome del modello di funzione, e poiché i modelli di funzione di membro di conversione e modelli di funzione membro costruttore sono chiamati senza l'utilizzo di un nome di funzione, non è possibile fornire un elenco di argomenti del modello esplicito per questi modelli di funzione. ]

Se si può vivere con esso, si può lavorare intorno

struct T { 
    template<class U> T(identity<U>); 
}; 

struct U { 
    U() : t(identity<void>()) {} 
    T t; 
}; 

Dato identity come è definito nella spinta

template<typename T> struct identity { typedef T type; }; 
+0

ringraziamento you.no disperatevi, posso lavorare intorno a questo – Anycorn

+13

@litb: Sai se c'è qualche ragione per cui semplicemente non ti permettono di chiamare esplicitamente T :: T ()? –

+0

@JosephGarvin sospetto perché 'T()' funzioni avendo la cosa prima che la parentesi sia di tipo, 'Type()' costruisce un oggetto temporaneo. Questo è incompatibile con 'T :: T ()' dove la cosa prima del paren è una funzione. Il significato di ciò è chiamare la funzione indicata. Ma chiamare direttamente un costruttore non ha senso, per lo meno richiederebbe una formulazione aggiuntiva per farlo funzionare e fare la cosa che ci si aspetta. –

Problemi correlati