Soru C ++ şablonları için iki fazlı isim araması - Neden?


C ++ standardı neden şablonlar için iki aşamalı arama tanımlar? Bağımlı olmayan beyanlar ve tanımların aramaları da örnekleme aşamasına ertelenemez mi?


21
2017-09-24 08:44


Menşei


İlgili: Microsoft Visual C ++ 'ın iki aşamalı şablon örneği ile tam olarak ne "kırıldı"?. Ayrıca, eğer google msvc broken two-phase name lookup Ne olduğuyla ilgili birkaç örnek daha alacaksınız. - Jesse Good


Cevaplar:


Yapabilirlerdi. Şablonların en erken uygulama şekli budur çalıştı ve hala Microsoft derleyicisinin çalıştığı yoldur. Hissedildi (komitede) bunun çok hataya eğilimli olduğunu; çok kolay oldu yanlışlıkla tek bir çeviri ile bir isim, bir isim kaçırmak istenen global sembol yerine yerel bir adın toplanması. (A tipik çeviri birimi bir dizi #includes, Herkesin görmesi gereken isimleri ilan etmek, ardından uygulamayı yapmak kodu. Anlatım noktasında, her şeyden önce Uygulama kodu da dahil olmak üzere, görünür.

Son karar, bir şablondaki sembolleri ikiye ayırmaktı. kategoriler: bağımlı ve bağımlı olmayan ve bağımlı olmayan semboller tanım noktasında çözülebilir Şablon, yanlışlıkla bir şekilde bağlı olmak riskini azaltmak için yerel uygulama sembolleri. Belirtme şartı ile birleştiğinde typename ve template bağımlı semboller için uygun olduğunda, bu ayrıca ayrıştırma ve tanım noktasında bazı hata kontrolüne izin verir Şablonun, yalnızca şablon örneği oluşturulduğunda değil.


28
2017-09-24 09:03



+1 - standartta verilen tanımların ardındaki akıl yürütmenin büyük bir açıklaması - Zdeslav Vojkovic
Teşekkürler! Sadece aradığım sebep. Yani şimdi yerel isimler (bağımlı olmayan kalıtsal üye fonksiyonlar), globals tarafından ele geçirilebilir. Bu doğru mu? - Xyand
@Albert Evet. Açıkçası, uyarlanmış çözümde fazla sıcak değildi (ve hala değil). Kısmen, çünkü tüm problemi çözmez; Bugün bile, bunun için tamamen nitelikli isimleri sistematik olarak kullanmanız gerekiyor. Ve ayrıca bağımlı ve bağımlı olmayan isimler arasındaki örtük farklılaşmayı biraz zor buluyorum: Eğer İki farklı bakış açısı gerçekten gerekli, o zaman ben argümanlara bağımlı olmak yerine, bağımlı bir görünüm alan isimleri açıkça belirtmek zorunda kalacağım. - James Kanze
@JamesKanze, bunun başarısız olacağı uygun bir örnek sağlayabilir misiniz? - user1708860


Bu bir uygulama olarak görülebilir endişelerin ayrılığı.

İlk aşamada doğru sözdizimini kontrol eder ve açıklanmadığı gibi bağımlı olmayan isimleri çözer. İşte. İkinci aşamada, aramaların belirli tiplerle geçerli olup olmadığını doğrulayan, daha şablona özgü bir şey yapar. Bu [cevap] 'a bakın İki fazlı arama - açıklama gerekli)

Dahası, eğer sadece bir aşamada yapılacaksa, o zaman her bir örnekleme yapılmalıdır. Bu yol sadece bir kez yapılır.

Sadece ilk örneklemede yapılacaksa, o zaman aynı şey olurdu, sadece daha az yapılandırılmış olurdu.


1
2017-09-24 08:50