zoukankan      html  css  js  c++  java
  • C++中模板类使用友元模板函数

    在类模板中可以出现三种友元声明:
    (1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。
    (2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。
    (3)只授予对类模板或函数模板的特定实例的访问权的友元声明。

    (1)普通友元:

    template<class T>

    class A{

       friend void fun();

    //...

    };
    此例中fun可访问A任意类实例中的私有和保护成员

    (2)一般模板友元关系

    template<class type>

    class A{

      template<classT>

       friend void fun(T u);

    //...

    };

    这时友元使用与类不同的模板形参,T可以是任意合法标志符,友元函数可以访问A类的任何类实例的数据,即不论A的形参是int,double或其他都可以。

    (3)特定的模板友元关系

    template <class T> void fun(T,u);//对与特定的模板友元关系,这里的声明是必须的

    template<class T>

    class A{

       friend voidfun<T>(T u);//这里也可以是friend void fun<char>(char u);

    //...

    };

    此时fun只有访问类中特定实例的数据。换句话说,此时具有相同模板实参的fun函数与A类才是友元关系。即假如调用fun时其模板实参为int,则它只具有A<int>的访问权限。当然friendvoid fun<T>(Tu);中<>中的T可以是任意类型,比如int,double等

    对类建立友元函数很容易。但是迁移到模板上却容易出现让人摸不着头脑的连接错误。
    层次不够,不做分析,单纯介绍两种为类模板定义友元函数的方法

      1 封闭型

    template< typename T >
    class MyClass
    {
        friend void function( MyClass< T > &arg )
        {
            
         }
     };  要点:友元函数定义在模板体内。

           2 开放型
    template< typename T >
    class MyClass
    {
        template< typename C >
        friend void function( MyClass< C > &arg );
     };

    template< typename C >
    void function( MyClass< C > &arg )
    {
        
     }  要点:模板体内要另建模板。 
      
      3 告诉编译器声明的设个是模板
    #include <iostream>
    using namespace std;

    template < typename T >
    class A
    {
        friend ostream &operator<< < T >( ostream &, const A< T > & );
     };

    template < typename T >
    ostream &operator<< ( ostream &output, const A< T > &a )
    {
        output << "重载成功" << endl;
        return output;
     }

    int main()
    {
        A< int > a;
        cout << a;
     }要点:显示地在重载的运算符或者函数后面加上模板声明< T>,告诉编译器友元函数是一个类型一致的模板。

     建议:
                如果希望使用函数与模板特化的类型相对应,则使用方法3(模板显示声明)
                如果希望使用函数与模板特化的类型相独立,则使用方法2(二重模板)
                简短的内联函数使用方法1

    参考  http://blog.sina.com.cn/s/blog_7c2c21230100svc3.html

  • 相关阅读:
    微服务架构技术栈选型手册(万字长文)
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    MFC对话框中使用CHtmlEditCtrl
    ATL开发 ActiveX控件的 inf文件模板
    ActiveX: 如何用.inf和.ocx文件生成cab文件
    Xslt 1.0中使用Array
    如何分隔两个base64字符串?
    An attempt was made to load a program with an incorrect format
    JQuery 公网 CDN
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4060219.html
Copyright © 2011-2022 走看看