类内声明

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()即可

(三)使用过渡函数

自定义类模板 重载<<遇到的问题的更多相关文章

  1. VS2015自定义类模板的方法

    在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...

  2. VS2015如何自定义类模板、我的模板——原来这么简单!

    在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...

  3. Intellij IDEA自定义类模板和方法模板

    以Intellij IDEA 2017.3.5为例 定义类模板 依次打开File->Settings->File and Code Templates->Files, 选择class ...

  4. VS自定义模板-以自定义类模板为样例

    前言 在实际的工作过程中部分公司会要求开发人员在开发过程中需遵守一些开发规范,开发规范中主要包括文件的注释规范,项目.文件.变量的命名规范(例如驼峰规范)等等.例如我们代码规范中就有一项新增文件的文件 ...

  5. [Visual Studio] 自定义类模板

    1.找到vs2015/vs2012/vs2017的安装目录下:Common7\IDE\ItemTemplates\CSharp\Code\2052\Class 2.打开Class.cs文件 using ...

  6. vs自定义类模板

    .找到VS安装目录,我的目录是:C:Program Files (x86)Microsoft Visual Studio 12.0 .在C:Program Files (x86)Microsoft V ...

  7. C++17尝鲜:类模板中的模板参数自动推导

    模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...

  8. C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类

    1 昨日回顾 2 编译器对于模板的二次编译 写一个模板函数 然后进行调用 g++ template.cpp -o template // 汇编 g++ -S template.cpp –o templ ...

  9. Xcode6中如何使用自定义的类模板

    说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...

随机推荐

  1. 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法

    ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':/home/king/php-5.2.13/ext/iconv/ ...

  2. 教程-Delphi设置功能表

    1.锁定窗体上的控件,禁止移动位置 D7-Edit>Lock Controls 2.设置控件永久显示名字 D7-Tools>Environment Options>Designer& ...

  3. SQLite 入门教程(二)创建、修改、删除表 (转)

    转于 SQLite 入门教程(二)创建.修改.删除表 一.数据库定义语言 DDL 在关系型数据库中,数据库中的表 Table.视图 View.索引 Index.关系 Relationship 和触发器 ...

  4. C# ip hash算法实现ip分流

    private void button42_Click(object sender, EventArgs e) { Dictionary<int, string> proxyIpNodes ...

  5. JBPM数据库表说明

    http://blog.163.com/tigerlion@126/blog/static/167675665201072642627400/ 最近这几天一直在研究JBPM工作流引擎,以下为JBMP的 ...

  6. Spring Bean Scope 有状态的Bean 无状态的Bean

    http://blog.csdn.net/anyoneking/article/details/5182164 在Spring的Bean配置中,存在这样两种情况: <bean id=" ...

  7. POJ 1330 Nearest Common Ancestors(Tree)

    题目:Nearest Common Ancestors 根据输入建立树,然后求2个结点的最近共同祖先. 注意几点: (1)记录每个结点的父亲,比较层级时要用: (2)记录层级: (3)记录每个结点的孩 ...

  8. 利用http协议实现图片窃取

    在http协议里有一个referer,用来标示站点来源,大家都遇到这样的情况.转载了一篇博客,图片显示不正常,就和头信息里这个有关 原理:在webserver里面.依据http协议里面refered头 ...

  9. Cookie中用户登录信息的提示

    public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSe ...

  10. 删除主目录下的.ssh目录下文件对boot2docker启动影响

    现象: 1) boot2docker ssh需要输入密码 2) boot2docker start 或 up 需要输入密码 解决方法: 1)删除 /Users/sunzhaoyu/.boot2dock ...