zoukankan      html  css  js  c++  java
  • 自定义类模板 重载<<遇到的问题

    类内声明

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

    (三)使用过渡函数

  • 相关阅读:
    windows已经阻止此软件因为无法验证发行者解决方案
    vs用resharp如何调试到源码而不是对象浏览器
    Android环境变量的设置(详细图解版)
    js为xml添加节点和属性
    javascript操作xml文件综合实例
    js如何循环读取xml文件的节点
    游标的简单理解
    关于DATE函数datediff dateadd datename等
    分组数据where & having ,group by & order by
    SQL拼接字段,算数计算
  • 原文地址:https://www.cnblogs.com/buptlyn/p/3606394.html
Copyright © 2011-2022 走看看