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

    (三)使用过渡函数

  • 相关阅读:
    移动端 h5开发相关内容总结——CSS篇
    水滴导航特效
    腾讯课堂之前端开发html5css3javascriptjQueryJS年薪20万
    阿里前端笔试总结
    Web 开发的未来:React、Falcor 和 ES6
    Yii2按需加载图片怎么做?
    Yii2 灵活加载js、css
    Ubuntu上搭建SVN
    yii pageTitle与Yii::app()->name的区别
    Mysql--Database Exception (#42) 数据库错误
  • 原文地址:https://www.cnblogs.com/buptlyn/p/3606394.html
Copyright © 2011-2022 走看看