首先,已声明好的类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. windows下创建MySQL定时备份与删除脚本

    今天在windows服务器上面写了一个MySQL定时任务,备份呢与删除 rem *****************************Code start********************* ...

  2. kubernetes核心概念

    摘抄自:  https://www.cnblogs.com/zhenyuyaodidiao/p/6500720.html 1.基础架构 1.1 Master Master节点上面主要由四个模块组成:A ...

  3. 学习使人快乐5-JavaWeb应用的组成结构

    开发JavaWeb应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错 WebRoot →Web应用所在目录,一般情况下虚拟目录要配置到此文件夹当中 ...

  4. Mapreduce中maptask过程详解

    一.Maptask并行度与决定机制 1.一个job任务的map阶段的并行度默认是由该任务的大小决定的: 2.一个split切分分配一个maprask来并行处理: 3.默认情况下,split切分的大小等 ...

  5. Gym 100963B

    Gym 100963B啊,郁闷,就tm调小了一点范围就A了,就写dp和贪心比较一下,范围到最大值的二倍-1就好了假设最大值的2倍以内能满足最优条件,当金额范围超过最大值2倍的时候:至于为什么,还不清楚 ...

  6. Android Studio 常用快捷键及常用设置

    Android Studio 常用快捷键及常用设置 一.常用快捷键 快捷键 描述 Ctrl + Alt + L 格式化代码 Ctrl + ( +/- ) 展开/折叠 代码块 Ctrl + Shift ...

  7. flask + MySQL-python 创建 webapp 应用

    0 - python 用自带的 wgsi 也可以创建 web 服务1)建立 hello.py 内容如下 # hello.pydef application(environ, start_respons ...

  8. The Water Bowls [POJ3185] [开关问题]

    题意 一串长度为20的0,1数列,每次翻转i,会影响i-1,i+1,也被翻转,最少翻转成0的步骤数是多少? Sample Input 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 ...

  9. 转 MYSQL SELECT ... FOR UPDATE and SELECT ... LOCK IN SHARE MODE Locking Reads

    原文: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html In some circumstances, a consis ...

  10. __http原理__01__通信流程_消息格式

    本文转自  菜鸟教程  一.HTTP协议(HyperText Transfer Protocol,超文本传输协议) 是因特网上应用最为广泛的一种网络传输协议, 是用于从万维网(WWW:World Wi ...