С++ для начинающих



         

Объявления друзей в шаблонах классов


  • обычный (не шаблонный) дружественный класс или дружественная функция. В следующем примере функция foo(), функция-член bar() и класс foobar объявлены друзьями всех конкретизаций шаблона QueueItem:
  • class Foo {

       void bar();

    };

    template <class T>

    class QueueItem {

       friend class foobar;

       friend void foo();

       friend void Foo::bar();

       // ...

    };

    Ни класс foobar, ни функцию foo() не обязательно объявлять или определять в глобальной области видимости перед объявлением их друзьями шаблона QueueItem.

    Однако перед тем как объявить другом какой-либо из членов класса Foo, необходимо определить его. Напомним, что член класса может быть введен в область видимости только через определение объемлющего класса. QueueItem не может ссылаться на Foo::bar(), пока не будет найдено определение Foo;

    • связанный дружественный шаблон класса или функции. В следующем примере определено взаимно однозначное соответствие между классами, конкретизированными по шаблону QueueItem, и их друзьями – также конкретизациями шаблонов. Для каждого класса, конкретизированного по шаблону QueueItem, ассоциированные конкретизации foobar, foo() и Queue::bar() являются друзьями.
    • template <class Type>

         class foobar { ... };

      template <class Type>

         void foo( QueueItem<Type> );

      template <class Type>

      class Queue {

            void bar();

            // ...

      };

      template <class Type>

      class QueueItem {

         friend class foobar<Type>;

         friend void foo<Type>( QueueItem<Type> );

         friend void Queue<Type>::bar();

         // ...

      };

      Прежде чем шаблон класса можно будет использовать в объявлениях друзей, он сам должен быть объявлен или определен. В нашем примере шаблоны классов foobar и Queue, а также шаблон функции foo() следует объявить до того, как они объявлены друзьями в QueueItem.

      Синтаксис, использованный для объявления foo() другом, может показаться странным:

      friend void foo<Type>( QueueItem<Type> );




      Содержание  Назад  Вперед