C++模板类中友元函数的写法
首先,已声明好的类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++模板类中友元函数的写法的更多相关文章
- gcc的bug? c++模板类中友元函数的訪问权限问题
原文地址:http://stackoverflow.com/q/23171337/3309790 在c++中,模板类中能够直接定义一个友元函数.该函数拥有訪问该模板类非public成员的权限. 比方: ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- c++ 模板类的 友元函数
#pragma once #include <iostream> template <class T> class stack { template <class Ty& ...
- C++中模板类使用友元模板函数
在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定 ...
- C++解析(16):友元与类中的函数重载
0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- C++学习之友元类和友元函数
C++学习之友元类和友元函数 模板类声明也可以有友元,模板的友元可以分为以下几类: 1.非模板友元: 2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...
- C++模板类中使用静态成员变量(例如Singleton模式)
一个最简单Singleton的例子: ///////// Test.h /////////template <class _T>class CTest{private:_T n;stati ...
- [转]引用模板类中定义的类型(用typedef或using)以及auto、decltype、typename的使用
一.背景 使用typedef或者using定义类型别名是非常常见的手段,在c++里面,有时为了封装性,模块性等原因还会在某一个namespace或者class内部定义类型别名. 最近在写c++代码的时 ...
随机推荐
- day18常用模块之re模块
简单认识正则表达式 正则测试工具:http://tool.chinaz.com/regex/ 元字符,单个字符匹配 . 匹配除换行符以外的任意字符 \w 匹配字母数字下划线(word) \s 匹配任意 ...
- JS语法转换-ES6转ES5
1.使用Babel转码 全局安装 npm install -g babel-cli 布局安装 npm install -g babel-cli --save-dev Babel的配置文件是.babel ...
- 在DOM加载之前insertScript
起因 由于工作原因需要联调碧桂园的SDK 大概是以下代码,起初我是放在head中的,因为最初这样调试,包括线上环境都是OK的,可以获取到SDK的内容,换句话说js节点是可以插入到root内的,自从换了 ...
- 初学Python的一些细节
一.python的数据类型 1.python的基本数据类型包括数值数据类型和字符串数据类型:基本数据类型的特点是不允许改变,如果改变基本数据类型的值,会导致内存的重新分配. int 整形 二进制 ...
- angular笔记_10
过滤器 currency:1:2:3 与货币相关 第一个参数是符号 第二个参数是保留小数点几位 number:1 ...
- java @Override 报错解决
有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@ ...
- Chapter 1 An Overview of Computers and Programming Languages
Babylon巴比伦 loom织布机 weaver, WHO uses loom to work census: to count the population tabulate: make into ...
- BOM 浏览器对象模型_当前窗口的浏览历史 history 对象
当前窗口的浏览历史 window.history 对象 保存了当前窗口访问过的所有页面网址 由于安全原因,浏览器不允许脚本读取这些地址,但是允许在地址之间导航 history.back() 相当于 h ...
- Ubuntu 安装 Redis和phpredis扩展
服务器Ubuntu16.04 环境php7.0+Apache /****************************开始安装Redis****************************/ 1 ...
- discuz 修改亮剑积分商城2.91模板(在常用设置中添加商场首页排序方式的背景颜色)
在应用 -> 积分商城 -> 常用设置 中添加 商场首页排序方式 的背景颜色修改功能 步骤: 1.找到并打开此页面对应的模板source\plugin\aljsc\template\set ...