自定义类模板 重载<<遇到的问题
类内声明
friend ostream& operator<<(ostream& os,const store<T> &item);
类外实现
template <typename T>
ostream& operator<<(ostream &os,const store<T> &item)
{
os << item.value;
return os;
}
使用
http://i.cnblogs.com/EditPosts.aspx?postid=3606394store<int> a(5);
cout << a << endl;
编译出现错误:
undefine reference to 'opeartor<<(std::basic_ostream<char,std::char_traits<char> >&,store<int> const&)'
网上大部分的解决思路是GCC编译时通知链接器链接静态库libstdc++,或者直接用g++编译,可是我本身就用的g++编译的啊
通过http://www.cnblogs.com/xkfz007/articles/2534322.html,找到解决方案
在类模板中重载输入和输出操作符,若是用友元在类内声明,在类外实现,链接时将会报错,可以采用以下三种方式实现输入输出操作符重载:
(一)
直接在类内实现
如果在类外实现,
template<typename T>
ostream& operator<<(ostream& os,store<T> &item)
{
os << item.value;
return os;
}
正好是函数模板的定义,因为重载操作符<<函数不是类的成员函数,所以这里相当与定义了新的函数模板,就不同与类中的声明(friend ostream& operator<<(ostream&,const store<T>&))。但是去掉template <typename T>,函数参数表中的T将不知类型,这个矛盾决定不能类内声明,类外实现
(二)
类外实现相当与定义了一个函数模板,则它不使用类的私有成员即可。通过类的公有成员实现对类的私有成员的操作。因此可以不再类内声明为友元,直接在类外实现重载
由于访问了私有成员value,可以为类实现一个public函数getValue,类外使用 os << item.getValue()即可
(三)使用过渡函数
自定义类模板 重载<<遇到的问题的更多相关文章
- VS2015自定义类模板的方法
在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...
- VS2015如何自定义类模板、我的模板——原来这么简单!
在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...
- Intellij IDEA自定义类模板和方法模板
以Intellij IDEA 2017.3.5为例 定义类模板 依次打开File->Settings->File and Code Templates->Files, 选择class ...
- VS自定义模板-以自定义类模板为样例
前言 在实际的工作过程中部分公司会要求开发人员在开发过程中需遵守一些开发规范,开发规范中主要包括文件的注释规范,项目.文件.变量的命名规范(例如驼峰规范)等等.例如我们代码规范中就有一项新增文件的文件 ...
- [Visual Studio] 自定义类模板
1.找到vs2015/vs2012/vs2017的安装目录下:Common7\IDE\ItemTemplates\CSharp\Code\2052\Class 2.打开Class.cs文件 using ...
- vs自定义类模板
.找到VS安装目录,我的目录是:C:Program Files (x86)Microsoft Visual Studio 12.0 .在C:Program Files (x86)Microsoft V ...
- C++17尝鲜:类模板中的模板参数自动推导
模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...
- C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类
1 昨日回顾 2 编译器对于模板的二次编译 写一个模板函数 然后进行调用 g++ template.cpp -o template // 汇编 g++ -S template.cpp –o templ ...
- Xcode6中如何使用自定义的类模板
说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...
随机推荐
- C# WinForm多线程(三)---- Control.Invoke[转]
开发中遇到更新Winform中控件假死问题,通过看了这篇文章了解了原理,感谢!此处标记起来,以备查看! 原文地址:http://www.cnblogs.com/joechen/archive/2009 ...
- A Tour of Go Pointers
Go has pointers, but no pointer arithmetic. Struct fields can be accessed through a struct pointer. ...
- 再看GOPATH
原本不打算介绍GOPATH,然而,总是有初学者问一些关于GOPATH的问题,因此在这里再介绍一下GOPATH GOPATH环境变量用于指定这样一些目录:除$GOROOT之外的包含Go项目源代码和二进制 ...
- Jquery实现图片轮播源码
<html><head><style type="text/css">#banner {position:relative; width:478 ...
- Android中解析JSON格式数据常见方法合集
待解析的JSON格式的文件如下: [{"id":"5", "version":"1.0", "name&quo ...
- 谷歌Flash不是最新版
http://www.adobe.com/support/flashplayer/debug_downloads.html
- Error In Work
ReferenceError: BAD_REQUEST is not defined MyBatis配置错误,比如$!conflict.id,写成conflict.$!id
- [置顶] 深入浅出Spring(一)Spring概述
现在很多的企业级项目中基本上都会用到了Spring框架,那么为什么会出现Spring,Spring是什么?这次的博文我主要为大家简单介绍一下Spring. Java EE优缺点 我们都知道在2003年 ...
- 六款值得推荐的android(安卓)开源框架简介【转】
http://my.oschina.net/u/1244156/blog/380647 1.volley 项目地址 https://github.com/smanikandan14/Volley-de ...
- spring scheduler相同时间内执行两次的问题
在网上找了大片文章,有的说是上下文被夹在两次的问题,可我配置scheduler的上下文着实没被夹在多次 之后才在网上找到,虽然还不明白原理,但是还是贴出来分享下