Překlad názvů místně deklarované
Samotný název šablony můžete uvedenému s nebo bez argumentů šablony.V působnosti šablonu třídy označuje samotný název šablony.V oboru specializace šablony nebo částečné specializace samotný název odkazuje na specializace nebo částečné specializace.Jiných odborností nebo částečné specializace šablony lze také označit, s argumenty příslušné šablony.
Příklad
Následující kód ukazuje různě vykládána a název šablony třídy v oboru specializace nebo částečné specializace.
// template_name_resolution3.cpp
// compile with: /c
template <class T> class A {
A* a1; // A refers to A<T>
A<int>* a2; // A<int> refers to a specialization of A.
A<T*>* a3; // A<T*> refers to the partial specialization A<T*>.
};
template <class T> class A<T*> {
A* a4; // A refers to A<T*>.
};
template<> class A<int> {
A* a5; // A refers to A<int>.
};
Z konflikt názvů mezi parametr šablony a jiný objekt parametr šablony lze nebo nelze skrýt.Následující pravidla vám pomohou určit priority.
Parametr šablony je v rozsahu od bodu, kde nejprve se až do konce šablony třídy nebo funkce.Pokud se název zobrazí znovu v seznamu argumentů šablony nebo seznam základních tříd, odkazuje na stejného typu.V jazyce C++ standardní žádný název, který je stejný jako parametr šablony lze deklarovat v rámci stejného oboru.Rozšíření Microsoft umožňuje předefinovat v oboru šablony parametr šablony.Následující příklad ukazuje použití parametru šablony základní specifikace šablony třídy.
// template_name_resolution4.cpp
// compile with: /EHsc
template <class T>
class Base1 {};
template <class T>
class Derived1 : Base1<T> {};
int main() {
// Derived1<int> d;
}
Při definování šablony členské funkce mimo šablonu třídy lze název parametru jinou šablonu.Pokud šablonu definice členské funkce používá jiný název parametru šablony než nemá prohlášení a použitý v definici konflikt s jiným členem prohlášení člena v šabloně prohlášení má přednost.
// template_name_resolution5.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
template <class T> class C {
public:
struct Z {
Z() { cout << "Z::Z()" << endl; }
};
void f();
};
template <class Z>
void C<Z>::f() {
// Z refers to the struct Z, not to the template arg;
// Therefore, the constructor for struct Z will be called.
Z z;
}
int main() {
C<int> c;
c.f();
}
Při definování funkce šablony nebo členské funkce mimo obor názvů, ve kterém byla prohlášena za šablony, šablony argument má přednost před názvy ostatních členů v oboru názvů.
// template_name_resolution6.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
namespace NS {
void g() { cout << "NS::g" << endl; }
template <class T> struct C {
void f();
void g() { cout << "C<T>::g" << endl; }
};
};
template <class T>
void NS::C<T>::f() {
g(); // C<T>::g, not NS::g
};
int main() {
NS::C<int> c;
c.f();
}
V definicích, které jsou mimo šablonu třídy prohlášení, pokud šablona třídy má základní třídu, která není závislá na argument šablony a základní třídu nebo jeden z jejích členů má stejný název jako argument šablony pak základní název třídy nebo člen skryje argument šablony.
// template_name_resolution7.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct B {
int i;
void print() { cout << "Base" << endl; }
};
template <class T, int i> struct C : public B {
void f();
};
template <class B, int i>
void C<B, i>::f() {
B b; // Base class b, not template argument.
b.print();
i = 1; // Set base class's i to 1.
}
int main() {
C<int, 1> c;
c.f();
cout << c.i << endl;
}