首先,已声明好的类Triangle

file://Triangle.h

template<class T>
class Triangle{
public:
Triangle(T width,T height);
private:
T width;
T height;
};

再在Triangle.hpp内补全构造函数

file://Triangle.hpp

template<class T>
Triangle<T>::Triangle(T width,T height){
this->width=width;
this->height=height;
}

------------------------------------------------------------------------

  以上为准备工作,接下来才是主要内容

----------------------------------------------------------------------

一.GCC与VC++都可以编译成功的版本

1.友元函数为重载函数

操作流程:

1) 在模板内添加友元函数声明(记住:因为友元函数也是函数模板,所以需要在函数名后加<T>)

file://Triangle.h

template<class T>
class Triangle{
public:
Triangle(T width,T height);
  friend ostream& operator<<<T>(ostream& os,Triangle<T>& t);
private:
T width;
T height;
};

2)定义友元函数

file://Triangle.hpp

template<class T> //这个T可以为其他代号 因为这是一个崭新的函数模板
ostream& operator<<(ostream& os,Triangle<T>& t){
os<<"高度为"<<t.height<<"宽度为"<<t.width;
return os;
}

2.普通友元函数

操作流程一共三步,第一步是在类模板定义前声明类模板和友元函数的函数模板,接下来两部与友元重载函数的两部一致

1)声明类模板和友元函数的函数模板+2)类模板内部声明友元函数

file://Triangle.h

template <class T> class Triangle;
template <class T> void showSize(Triangle<T>& t); template<class T>
class Triangle{
public:
Triangle(T width,T height);
friend void showSize<T>(Triangle<T>& t);
private:
T width;
T height;
};

3)定义友元函数的函数模板

file://Triangle.hpp

template<class T>
void showSize(Triangle<T>& t){
cout<<"the size of triangle is "<<t.width*t.height/<<" square."<<endl;

总结:

重载函数与一般友元函数的写法区别:如果是模板类中的普通友元函数,那需要在模板类定义前声明一下模板类以及模板函数,如果是重载函数则不需要。

二.只有VC++编译器可以编译成功的版本

如果你使用的是VS这种IDE,那么不用管是一般友元函数还是重载函数 ,写法都一样

1)现在模板类中声明友元函数

file://Triangle.h

template<class T>
class Triangle{
public:
Triangle(T width,T height);
template<class T>
friend ostream& operator<<(ostream& os,Triangle<T>& t);
template<class T>
friend void showSize(Triangle<T>& t);
private:
T width;
T height;
};

2)定义(定义与 一. 中一致,这里就不写了)

整体总结,

一,优点:多种c++编译器都可以编译成功。缺点,一般友元函数写法与友元重载函数写法不同

二,优点:友元函数写法就一种。缺点,只可以在vs上的vc++编译器编译成功。

我个人建议还是使用一。

C++模板类中友元函数的写法的更多相关文章

  1. gcc的bug? c++模板类中友元函数的訪问权限问题

    原文地址:http://stackoverflow.com/q/23171337/3309790 在c++中,模板类中能够直接定义一个友元函数.该函数拥有訪问该模板类非public成员的权限. 比方: ...

  2. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...

  3. c++ 模板类的 友元函数

    #pragma once #include <iostream> template <class T> class stack { template <class Ty& ...

  4. C++中模板类使用友元模板函数

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

  5. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

  6. C++模板类内友元(友元函数,友元类)声明的三种情况

    根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{     void bar(); ...

  7. C++学习之友元类和友元函数

    C++学习之友元类和友元函数       模板类声明也可以有友元,模板的友元可以分为以下几类:        1.非模板友元:        2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...

  8. C++模板类中使用静态成员变量(例如Singleton模式)

    一个最简单Singleton的例子: ///////// Test.h /////////template <class _T>class CTest{private:_T n;stati ...

  9. [转]引用模板类中定义的类型(用typedef或using)以及auto、decltype、typename的使用

    一.背景 使用typedef或者using定义类型别名是非常常见的手段,在c++里面,有时为了封装性,模块性等原因还会在某一个namespace或者class内部定义类型别名. 最近在写c++代码的时 ...

随机推荐

  1. 分享关于搭建高性能WEB服务器的一篇文章

    这篇文章主要介绍了Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器的相关资料,需要的朋友可以参考下(http://m.0813s ...

  2. mybatis代码生成器——MyBatis Generator

    1.maven依赖 a.加入依赖 <!-- mybatis生成工具 --> <dependency> <groupId>org.mybatis.generator& ...

  3. arp_spoof脚本的编写

    协议包分析 ARP原理: 在PC1 访问 Server 的流量 要经过网关  也就是 192.168.1.254 欺骗原理:pc1  与 网关 建立 MAC  ARP 缓存 我们将KALI 攻击机的 ...

  4. C#使用NanUI或ChromiumFx碰到的坑(一)

    最近在花时间封装一个Razor模板+NanUI的Winform组件,发现了有个神奇地方,,由于需要使用CfxResourceHandler,用于把对cshtml文件的请求,编译成html并返回给CEF ...

  5. oracle 删除重复记录

    查询及删除重复记录的SQL语句   1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断   select * from 表 where Id in (select Id from 表 g ...

  6. Django运行访问项目出现的问题:DisallowedHost at / Invalid HTTP_HOST header

    Django运行访问项目出现的问题:DisallowedHost at / Invalid HTTP_HOST header: DisallowedHost at / Invalid HTTP_HOS ...

  7. C# - 什么是事件绑定?

    今天在学习C#时碰到了一个新词:“绑定事件”,不知道是什么东西? 请各位C#前辈指点!!!

  8. git Disconnected:No supported authentication methods available问题解决

    在本地克隆gitlab上的项目,报如下错误:Disconnected:No supported authentication methods available(server sent:publick ...

  9. Tarjan求割点(割顶) 割边(桥)

    割点的定义: 感性理解,所谓割点就是在无向连通图中去掉这个点和所有和这个点有关的边之后,原先连通的块就会相互分离变成至少两个分离的连通块的点. 举个例子: 图中的4号点就是割点,因为去掉4号点和有关边 ...

  10. Ubuntu 配置安装PCL

    Ubuntu 配置安装PCL 之前一直在Mac下开发,现在入手Ubuntu,也借此学习一下Linux下的源码编译安装过程. PCL简介 PCL(Point Cloud Library)是在吸收了前人点 ...