2011-10-14 15 views
61

Che cosa significa che il compilatore sta utilizzando la ricerca a due fasi per compilare la classe template?Ricerca a due fasi - spiegazione necessaria

+1

@Nawaz Ho sentito solo due fasi di ricerca, c'è qualcosa che mi manca? – smallB

+2

Un breve e utile articolo sull'argomento è disponibile su http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html –

+1

Vedere anche http://stackoverflow.com/a/10171507/76722 e http://stackoverflow.com/a/7241548/76722 –

risposta

52

modelli sono compilati (almeno) due volte:

  1. Senza la creazione di istanze del codice modello stesso viene verificata la sintassi.
    Es: Eventuali errori di sintassi errori come ; ecc

  2. Al momento della istanziazione (quando il tipo esatto è noto), il codice del modello viene nuovamente controllata per garantire tutte le chiamate sono valide per quel tipo particolare.
    Ad esempio: il modello potrebbe richiamare chiamate a funzioni che potrebbero non essere presenti per quel particolare tipo.

Si chiama Ricerca in due fasi.

+38

Si noti inoltre che la ricerca di nomi non dipendenti viene eseguita nella prima fase, mentre la ricerca di nomi che dipendono da un parametro di modello viene eseguita nel secondo fase. Il significato è che se si chiama 'sqrt (1)', allora 'sqrt' deve essere dichiarato prima che il modello sia definito. Ma se chiamate 'sqrt (t)', dove 't' è un'istanza di un tipo che è un parametro template, quindi' sqrt' non deve essere visibile fino a quando il modello non viene istanziato. MSVC non era abituato a farlo correttamente: potrebbe non esserlo per quello che so. –

+11

Ad ogni modo, è per questo che si chiama ricerca in due fasi * rispetto alla compilazione in due fasi o qualcosa del genere. La prima fase dovrebbe fare molto di più che controllare la sintassi, ma MS ha avuto qualche difficoltà nell'implementazione della prima fase di ricerca, quindi hanno fatto tutto ciò che è stato necessario per la creazione di istanze: http://stackoverflow.com/questions/6273176/what-exactly-is -broken-con-microsoft-visual-cs-modello-a due fasi-instantia –

+0

@SteveJessop: Sembra più simile a questo: la chiave è la parte "ricerca" della ricerca a due fasi. Grazie! –

Problemi correlati