2011-10-14 23 views
61

Şablon sınıfını derlemek için derleyici iki aşamalı arama kullandığı anlamına mı geliyor?İki fazlı arama - açıklama gerekli

+1

@Nawaz Sadece iki aşamalı aramadan duydum, kayıp bir şey var mı? – smallB

+2

Konuyla ilgili kısa ve yararlı bir makale http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html adresinde bulunabilir –

+1

Ayrıca bkz http://stackoverflow.com/a/10171507/76722 ve http://stackoverflow.com/a/7241548/76722 –

cevap

52

Şablonlar iki kez (en az) derlenmektedir: şablon kodu kendisi sözdizimi için kontrol edilir

  1. örnekleme o olmadan.
    Örn: Böyle (tam tip bilinir) örnekleme sırasında

  2. vb ; gibi herhangi sözdizimi hataları hataları, şablon kodu tüm çağrılar söz konusu türü için geçerli olduğundan emin olmak için tekrar kontrol edilir.
    Ör: Şablon, söz konusu türde bulunmayabilecek işlevlere çağrıyı çağırabilir.

Bu, İki Fazlı Arama olarak adlandırılır.

+38

Ayrıca, bağımlı olmayan adların aranmasının ilk aşamada yapıldığını, oysa şablon parametresine bağlı isimlerin aranmasının ikinci sırada yapıldığını unutmayın. faz. Önem, eğer sqrt (1) 'yi çağırırsanız, şablon tanımlanmadan önce' sqrt '' un bildirilmesi gerekir. Ama eğer 't', bir şablon parametresi olan bir türün örneğidir 'sqrt (t) 'olarak adlandırırsanız, şablon başlatılıncaya kadar' sqrt' görünmemelidir. MSVC bunu doğru bir şekilde yapmadı: bildiğim her şey için hala geçerli olmayabilir. –

+11

Her neyse, bu yüzden iki fazlı derleme veya bir şey yerine iki fazlı * arama * olarak adlandırılır. İlk fazın sadece sözdizimini kontrol etmekten daha fazlasını yapması gerekiyordu, ancak MS ilk arama aşamasını uygularken bazı zorluklar yaşadı, bu yüzden hepsini anında gerçekleştirdiler: http://stackoverflow.com/questions/6273176/what-exactly-is -microsoft-visual-cs-iki-faz-şablon-instantia –

+0

@SteveJessop: Bu daha çok gibi geliyor - anahtar iki-fazlı arama "arama" kısmıdır. Teşekkürler! –