模板3(template)
1、When Classes and Members Are Instantiated
Member functions of a class template are instantiated only for functions that are used by the program. If a function is never used, then that member function is never instantiated. This behavior implies that types used to instantiate a template need to meet only the requirements of the operations that are actually used.
// instantiates Queue<int> class and Queue<int>::Queue() Queue<string> qs; qs.push("hello"); // instantiates Queue<int>::push
The instantiation of the push member:
template <class Type> void Queue<Type>::push(const Type &val) { // allocate a new QueueItem object QueueItem<Type> *pt = new QueueItem<Type>(val); // put item onto existing queue if (empty()) head = tail = pt; // the queue now has only one element else { tail->next = pt; // add new element to end of the queue tail = pt; } }
in turn instantiates the companion QueueItem<string> class and its constructor.
The QueueItem members in Queue are pointers. Defining a pointer to a class template doesn't instantiate the class; the class is instantiated only when we use such a pointer. Thus, QueueItem is not instantiated when we create a Queue object. Instead, the QueueItem class is instanatiated when a Queue member such as front, push , or pop is used.
2、Friend Declarations in Class Templates
There are three kinds of friend declarations that may appear in a class template. Each kind of declaration declares friendship to one or more entities:
(1)A friend declaration for an ordinary nontemplate class or function, which grants friendship to the specific named class or function.
template <class Type> class Bar { // grants access to ordinary, nontemplate class and function friend class FooBar; friend void fcn(); // ... };
(2)A friend declaration for a class template or function template, which grants access to all instances of the friend.
template <class Type> class Bar { // grants access to Foo1 or templ_fcn1 parameterized by any type template <class T> friend class Foo1; template <class T> friend void templ_fcn1(const T&); // ... };
(3)A friend declaration that grants access only to a specific instance of a class or function template.
template <class T> class Foo2; template <class T> void templ_fcn2(const T&); template <class Type> class Bar { // grants access to a single specific instance parameterized by char* friend class Foo2<char*>; friend void templ_fcn2<char*>(char* const &); // ... };
More common are friend declarations of the following form:
template <class T> class Foo3; template <class T> void templ_fcn3(const T&); template <class Type> class Bar { // each instantiation of Bar grants access to the // version of Foo3 or templ_fcn3 instantiated with the same type friend class Foo3<Type>; friend void templ_fcn3<Type>(const Type&); // ... };
3、Declaration Dependencies
When we want to restrict friendship to a specific instantiation, then the class or function must have been declared before it can be used in a friend declaration:
template <class T> class A; template <class T> class B { public: friend class A<T>; // ok: A is known to be a template friend class C; // ok: C must be an ordinary, nontemplate class template <class S> friend class D; // ok: D is a template friend class E<T>; // error: E wasn't declared as a template friend class F<int>; // error: F wasn't declared as a template };
浙公网安备 33010602011771号