Szablony i rozpoznawanie nazw

W definicjach szablonów, istnieją trzy typy nazw.

  • Nazwy zadeklarowane lokalnie, wraz z nazwą samego szablonu i wszelkimi nazwami zadeklarowanymi wewnątrz jego definicji.

  • Nazwy z otaczającego zakresu poza definicją szablonu.

  • Nazwy, które w jakiś sposób zależą od argumentów szablonu, nazywane nazwami zależnymi.

Mimo że dwie pierwsze nazwy dotyczą również zakresów klas i funkcji, to wymagane są specjalne reguły rozwiązywania nazw w definicjach szablonów, aby poradzić sobie ze złożonością dodaną przez nazwy zależne. Jest to spowodowane faktem, że kompilator wie o tych nazwach niewiele, dopóki nie zostanie utworzone wystąpienie szablonu, dlatego że nazwy mogą mieć zupełnie różne typy, w zależności od użytych argumentów szablonu. Nazwy niezależne są wyszukiwane zgodnie ze zwykłymi regułami oraz w punkcie definicji szablonu. Nazwy te, będące niezależnymi argumentami szablonu, są wyszukiwane raz dla wszystkich jego specjalizacji. Nazwy zależne nie są wyszukiwane, dopóki nie zostanie utworzone wystąpienie szablonu, a wyszukiwanie następuje osobno dla każdej specjalizacji.

Typ jest zależny, jeśli zależy od argumentów szablonu. W szczególności, typ jest zależny, jeśli jest:

  • Argumentem szablonu:

    T
    
  • Nazwą kwalifikowaną z kwalifikacją zawierającą typ zależny:

    T::myType
    
  • Nazwą kwalifikowaną, jeśli część niekwalifikowana identyfikuje typ zależny:

    N::T
    
  • Typem „const” lub „volatile”, którego typ podstawowy jest typem zależnym:

    const T
    
  • Wskaźnikiem, odwołaniem, tablicą lub wskaźnikiem do funkcji opartym na typie zależnym:

    T *, T &, T [10], T (*)()
    
  • Tablicą, której rozmiar jest oparty na parametrze szablonu:

    template <int arg> class X {
    int x[arg] ; // dependent type
    }
    
  • Typem szablonowym utworzonym z parametru szablonu:

    T<int>, MyTemplate<T>
    

Zależność typu i wartości

Nazwy i wyrażenia zależne od parametru szablonu są klasyfikowane jako zależne od typu lub zależne od wartości, w zależności od tego, czy parametr szablonu jest parametrem typu, czy parametrem wartości. Ponadto wszystkie identyfikatory zadeklarowane w szablonie z typem zależnym od argumentu szablonu są uznawane za zależne od wartości, podobnie jak typ całkowitej lub wyliczenia zainicjowany za pomocą wyrażenia zależnego od wartości.

Wyrażenia zależne od typu i wartości są wyrażeniami, które zawierają zmienne zależne od typu lub wartości. Wyrażenia te mogą mieć różną semantykę, w zależności od użytych parametrów szablonu.

Zobacz też

Szablony