2011-10-14 11 views
61

Co to znaczy, że kompilator używa wyszukiwania dwufazowego do kompilacji klasy szablonów?Wyszukiwanie dwufazowe - potrzebne wyjaśnienie

+1

@Nawaz Słyszałem tylko o dwóch fazach wyszukiwania, czy jest coś, czego mi brakuje? – smallB

+2

Krótki i przydatny artykuł na ten temat można znaleźć na stronie http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html –

+1

Zobacz także http://stackoverflow.com/a/10171507/76722 i http://stackoverflow.com/a/7241548/76722 –

Odpowiedz

52

Szablony są kompilowane (conajmniej) dwukrotnie:

  1. Bez instancji sam kod szablonu jest sprawdzana pod kątem składni.
    Np jakieś błędy składniowe błędy takie jak ; itp

  2. W momencie konkretyzacji (gdy dokładny rodzaj jest znany), kod szablonu jest sprawdzany ponownie, aby upewnić się wszystkie połączenia są ważne dla danego typu.
    Np .: Szablon może wywoływać funkcje, które mogą nie być obecne dla danego typu.

Jest to tak zwane wyszukiwanie dwufazowe jako .

+38

Należy również zwrócić uwagę, że wyszukiwanie nazw niezależnych jest wykonywane w pierwszej fazie, natomiast wyszukiwanie nazw zależnych od parametru szablonu odbywa się w drugim etapie. faza. Istotne jest to, że jeśli wywołasz 'sqrt (1)', to 'sqrt' musi zostać zadeklarowane przed zdefiniowaniem szablonu. Ale jeśli wywołasz 'sqrt (t)', gdzie 't' jest instancją typu będącego parametrem szablonu,' sqrt' nie musi być widoczny, dopóki nie zostanie utworzony instancja szablonu. MSVC nie użył tego poprawnie: może nie dla wszystkich, których znam. –

+11

W każdym razie dlatego nazywa się to przeglądaniem dwufazowym *, a nie tylko dwufazową kompilacją lub czymś podobnym. Pierwsza faza ma zrobić coś więcej niż tylko sprawdzenie składni, ale MS miało trudności z zaimplementowaniem pierwszej fazy wyszukiwania, więc po prostu zrobili to wszystko podczas tworzenia instancji: http://stackoverflow.com/questions/6273176/what-exactly-is -broken-with-microsoft-visual-cs-dwufazowy-szablon-instantia –

+0

@SteveJessop: Brzmi bardziej jak to - klucz jest "lookup" część dwufazowego wyszukiwania. Dzięki! –