c++-C++怎么把模板类设置为友元?

问题描述

C++怎么把模板类设置为友元?

求好心人解答~~
1.怎么把模板类设置为友元??模板函数 模板类。
2.设置的时候 需要具体化吗?? 是不是 可以具体化 也可以不具体??

解决方案

参考:http://www.cnblogs.com/li-peng/p/3512887.html

解决方案二:

根据《C++ Primer》第三版16.4节的叙述,C++类模板友元分为以下几种情况
1.非模板友元类或友元函数。 书上给了一个例子:
class Foo{
void bar();
};
template
class QueueItem{
friend class foobar;
friend void foo();
friend void Foo::bar();
//....
};
很简单,跟非模板类没什么区别,有一点需要注意,如果要把函数和类生命为友元,前面不需要声明或定义。但是如果要把类成员函数声明为友元,则前面必须有类的定义(注意不是声明,是定义),因为一个类成员只能由该类的定义引入 。

2.绑定的友元类模板或函数模板。 例子如下:
template
class foobar{ ...};

template
void foo(QueueItem);

template
class Queue{
void bar();
//...
};

template
class QueueItem {
friend class foobar ;
friend void foo (QueueItem);
friend void Queue ::bar();
//...
};
需要注意两点:
a.与非模板函数或类不同,模板函数或类声明为友元之前必须在前面声明过 ,否则无法通过编译。
b.注意红字部分,那几个Type不能少。比如对于函数foo,如果少了的话编译器会将其作为非模板函数对待,也就是说,对于QueueItem,编译器会查找void foo(QueueItem),而对templatevoid foo(QueueItem)视而不见,如果没找到非模板函数则会报错。

3.非绑定友元类模板或函数模板。 举例如下:
template
class QueueItem {
template
friend class foobar;

template<class T>
    friend void foo(QueueItem<T>);

template<class T>
    friend void Queue<T>::bar();
//...

};

解决方案三:

根据《C++ Primer》第三版16.4节的叙述,C++类模板友元分为以下几种情况
1.非模板友元类或友元函数。 书上给了一个例子:
class Foo{
void bar();
};
template
class QueueItem{
friend class foobar;
friend void foo();
friend void Foo::bar();
//....
};
很简单,跟非模板类没什么区别,有一点需要注意,如果要把函数和类生命为友元,前面不需要声明或定义。但是如果要把类成员函数声明为友元,则前面必须有类的定义(注意不是声明,是定义),因为一个类成员只能由该类的定义引入 。

2.绑定的友元类模板或函数模板。 例子如下:
template
class foobar{ ...};

template
void foo(QueueItem);

template
class Queue{
void bar();
//...
};

template
class QueueItem {
friend class foobar ;
friend void foo (QueueItem);
friend void Queue ::bar();
//...
};
需要注意两点:
a.与非模板函数或类不同,模板函数或类声明为友元之前必须在前面声明过 ,否则无法通过编译。
b.注意红字部分,那几个Type不能少。比如对于函数foo,如果少了的话编译器会将其作为非模板函数对待,也就是说,对于QueueItem,编译器会查找void foo(QueueItem),而对templatevoid foo(QueueItem)视而不见,如果没找到非模板函数则会报错。

3.非绑定友元类模板或函数模板。 举例如下:
template
class QueueItem {
template
friend class foobar;

template<class T>
    friend void foo(QueueItem<T>);

template<class T>
    friend void Queue<T>::bar();
//...

};

解决方案四:

模板类在作为友元之前,一定要出现一次声明像下面这样做:
template
class ChainList;

template
class Node{

friend class ChainList;
public:

T data;

T *link;
};

时间: 2024-11-01 18:20:49

c++-C++怎么把模板类设置为友元?的相关文章

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

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

第7周-任务3-复数模板类

[预备]阅读P314的例10.1. #include <iostream> using namespace std; class Complex { public: Complex( ){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex complex_add(Complex &c2); void display( ); private: double real; double imag; }; Com

C++第7周(春)项目5 复数模板类(加使用友元函数拓展)

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目5-复数模板类] 阅读P314的例10.1.该例实现了一个复数类,但是美中不足的是,复数类的实部和虚部都固定只能是double型的.可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时用的实际类型. (1)要求类成员函数在类外定义. (2)在此基础上,再实现减法.乘法和除法 你可以使用的main()函数如下: in

ASP 通用模板类

模板 ASP 通用模板类. 适合存在较少循环的模板.未实现内部循环,需要使用正则表达式,较浪费资源和时间,如需使用可参考这篇文章. 特性可设定私有缓存或公共缓存,提高效率可自由选择使用 Stream 组件或 FSO 组件支持自定义文件编码可保存文件 属性 Name文本,该模板名称,主要用于使用公共缓存时区分不同模板. Format文本,文件编码类型,可设置值. Object文本,使用组件,可设置值: StreamFSO PublicCache布尔值,使用公共缓存,开启时模板文件将保存到Appli

ASP通用模板类

  ASP 通用模板类. 适合存在较少循环的模板.未实现内部循环,需要使用正则表达式,较浪费资源和时间,如需使用可参考这篇文章. 特性 可设定私有缓存或公共缓存,提高效率 可自由选择使用 Stream 组件或 FSO 组件 支持自定义文件编码 可保存文件 属性 Name 文本,该模板名称,主要用于使用公共缓存时区分不同模板. Format 文本,文件编码类型,可设置值. Object 文本,使用组件,可设置值: Stream FSO PublicCache 布尔值,使用公共缓存,开启时模板文件将

c++模板类

理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:"模板的使用是容易的,但组织编写却不容易".看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂. 我在5年前开始使用模板,那时我看到了MFC的容器类.直到去年我还没有必要自己编写模板类.可是在我需要自己编写模板类时,我首先遇到的事实却是"传统"编程方法(在*.h文件声明,在*.cpp文

对asp.net1.1开发模板类的一些修改说明

asp.net|模板 本次StringTempletReplet.dll组件更新了一些算法.主要是更依赖内存里静态变量内的数值.做到了在不改变模板的条件下.缓存模板,缓存委托,缓存标签解析数据.但是这会更消耗一些内存. 为了可以动态更换模板,不得不每次检测文件的时间.在这个上消耗了不少时间.也许将来应该去掉动态更换模板的功能,只提供一个通知模板类重新读哪个模板文件的接口. 取消了这个页面 (RetuenString.aspx --接受标签字符串 返回解析结果)毕竟标签不会做成一种脚本语言.这个功

网友原创的PHP模板类

网友原创的PHP模板类 以下是PHP源代码:<?php     class Lightpage_Template {              var $Tpl_Header;         var $Tpl_Footer;         var $Tpl_Parsing;         var $Tpl_Template;         var $Tpl_Dirname;                  var $Tpl_Parse_String;         var $Tpl_

asp.net1.1 开发专用模板类

asp.net|模板 做web开发也有几年了.自己在不同的公司有不同的认识.最近做blog项目.自己认识到了模板类在web开发中的作用.自己晚上在家.总想可以做一个专门的为asp.ne开发而设计的模板类.于是就写了这个模板类.    下载地址点这     把下载下来的 500sea.txt 文件改名为  Templet.rar 文件打开就可以 如果打开http://img.club.163.com/images/user/other/500sea没有提示 500sea.txt文件下载.那就用网络