zoukankan      html  css  js  c++  java
  • 类模板中的友元声明

    有三种友元声明可以出现在类模板中:

    1 非模板友元类或友元函数

    函数 foo() 成员函数bar()以及 foobar类都是类模板QueueItem的所有实例的友元

    class Foo {
     void bar();
    };
     
    template <class T>
    class QueueItem {
     friend class foobar;
     friend void foo();
     friend void Foo::bar();
     // ...
    };

    2 绑定的 bound 友元类模板或函数模板:

    在类模板 QueueItem的实例和它的友元也是模板实例之间定义了一对一的映射,对 QueueItem的每一个类型的实例,foobar foo()和 Queue<T>::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();
     
     // ...

    };

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

    函数名后面紧跟着显式的模板实参表 foo<type> 这种语法可用来指定该友元声明所引用的函数模板 foo()的实例。

    如果省略了显式的模板实参 如下所示:

    friend void foo( QueueItem<Type> );
    则友元声明会被解释为引用了一个非模板函数,且该函数的参数类型是类模板 QueueItem的一个实例。

    3 非绑定的 unbound 友元类模板或函数模板

    在类模板QueueItem的实例和其友元之间定义了一对多的映射,

    对 QueueItem的每一个类型的实例 foobar foo()和 Queue<T>::bar()的所有实例都是友元,如下所示:

    template <class Type>
    class QueueItem {
     template <class T>
      friend class foobar;
     
     template <class T>
      friend void foo( QueueItem<T> );
     
     template <class T>
      friend void Queue<T>::bar();
     
     // ...

    };

    我们应该注意 在标准 C++之前的编译器不支持类模板中的这种友元声明


  • 相关阅读:
    java--面向抽象编程
    java--面向接口编程
    一个网页的测试用例
    浏览器Notwork XHR被隐藏了
    在element-ui label中设置空格
    数组对象排序
    js动态替换和插入字符串
    vue-quill-editor回显时移除焦点
    vue中监听页面是否有回车键按下
    vue-quill-edito 字体倾斜加粗无效
  • 原文地址:https://www.cnblogs.com/lidan/p/2239489.html
Copyright © 2011-2022 走看看