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

时间: 2024-09-28 09:35:24

C++中模板类使用友元模板函数的相关文章

template-c++模板类包含typedef 指针函数,vs2012编译错误

问题描述 c++模板类包含typedef 指针函数,vs2012编译错误 #include "stdafx.h" #include<stdexcept> #ifndef ToozyBinaryTreeHead #define ToozyBinaryTreeHead template <class T> class ToozyBinaryTree{ public: typedef bool (*findFunc)(typename const ToozyBinar

模板类的友元

非模板友元 声明一个常规友元 template <class T> class HasFriend { public: friend void counts(); } 上边的声明使counts()函数成为模板所有实例化的友元 counts()函数不是通过对象调用的(它是友元,不是成员函数),也没有对象参数,那么它如何访问HasFriend对象的呢 有很多种可能性.它可以访问全局对象;可以使用全局指针访问非全局对象;可以创建自己的对象;可以访问独立对象的模板类 的静态数据成员. 如果要为友元函数

MFC中常用类、宏、函数的简单介绍

闲来无事,整理了一下MFC中常用的类.宏.函数. 常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, int r, int b ); 指明四个坐标 CRect( const RECT& srcRect ); 由RECT结构构造 CRect( LPCRECT lpSrcRect ); 由RECT结构构造 CRect( POINT point, SIZE

C++中的类静态成员和静态成员函数

(1)为什么需要类静态成员? 有时候某个类的多个对象需要访问一个全局对象,在这种情况下"提供一个全局对象"比"每个类都维持一个独立的数据成员"要更为有效.而类静态成员与全局变量相比,又有两点好处:(a)不存在与程序中其他全局名字冲突的可能性:(b)可设置为private,实现信息隐藏. (2)类静态成员的特点 对于非静态数据成员,每个类对象都有自己的拷贝,而静态数据成员对每个类类型只有一个拷贝.由于静态数据成员分配在全局数据区,因此在程序开始运行时就必须存在,故静态

C++第7周项目5 - 模板类中使用友元函数

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8775137 [项目5-模板类中使用友元函数]友元函数提供了一种非成员函数访问私有数据成员的途径,模板类使类中的数据成员的类型变得灵活,这两种技术可以结合起来用.要求在项目4的基础上能够支持用友员函数实现的加法.用于测试的main()函数如下: int main

模板类怎么在另一个文件中使用?

问题描述 //test.htemplate<typename T>class A{public: A(); void fun();};//test.cpp#include"test.h"template<typename T>A<T>::A(){}template<typename T>void A<T>::fun(){}int main(){ A<int> a;//在test.cpp里面可以编绎通过,但是在另一个

在PHP世界中选择最合适的模板与使用方法第1/2页_php模板

在PHP世界中选择最合适的模板 /google 的广告条--> 事情的起因:你用过FastTemplate吗?对于PHP工程中的模板应用,其实我和我的同事们已经在许多的项目中接触过--关于它的好处,我想无论是在实际开发阶段还是上升到设计模式的角度都已经有很多"前辈先哲"讨论过了.就项目实施而言,在一些中型甚至大型的项目中,有效的将HTML(还有其他文本形式的表现层)和PHP代码分开,不仅在开发阶段可以分别提高界面设计人员和应用程序编写人员的工作效率,更会给项目的测试和维护带来巨大

C++模板类的用法实例_C 语言

本文实例讲述了C++中模板类的用法,分享给大家供大家参考.具体方法如下: //#include "StdAfx.h #ifndef __AFXTLS_H__ #define __AFXTLS_H__ #include <Windows.h> class CSimpleList { public: CSimpleList(int nNextOffset=0); void Construct(int nNextOffset); //接口 BOOL IsEmpty() const; voi

在PHP世界中选择最合适的模板--比较PHPLIB Template和FastTemplate

比较|模板 PHP工程中的模板应用,是进行中型乃至大型项目中建议采用的处理表现层的好办法.但是具体到模板的实施,采用何种现有的模板技术却需要进行一番比较.PHP世界中比较受关注的模板处理有PHPLIB Template和FastTemplate两种,我们对技术的易用性和速度进行了评测--想知道结果吗? 事情的起因:你用过FastTemplate吗?对于PHP工程中的模板应用,其实我和我的同事们已经在许多的项目中接触过--关于它的好处,我想无论是在实际开发阶段还是上升到设计模式的角度都已经有很多"