模板类的几点注意

最近刚学了C++的模板类设计,刚开始上手的时候,总是会有一大堆的bug 摆在那里,确实模板作为多态实现的一种方式,很多时候需要我们去设想和顾虑很多方面的事情,一不留神就会造成出错。而且模板类在编译的时候并不会有什么问题,模板类只有在具体的模板类具体化之后才会显现出来。至少对于我来说还是挺头痛的。
  那今天我就记录一下自己在模板类设计的时候容易犯的错误。

模板类的运算符重载

再用友元函数重载>>和<<这些运算符的时候千万不要把函数定义写在类定义外面!!
再用友元函数重载>>和<<这些运算符的时候千万不要把函数定义写在类定义外面!!
再用友元函数重载>>和<<这些运算符的时候千万不要把函数定义写在类定义外面!!
重要的事情说三遍。
代码如下:

#include "stdafx.h"
#include   <iostream>
using   namespace   std;  
   
template<class T>  
class Test  
{  
   public:  
      Test(const T& t):data(t){}
      //---------------------------------------------
      friend ostream& operator<<(ostream& out,Test<T>& t)    //输出流重载声明及实现
      {
           return out<<"data   is   "<<t.data;
      } //--------------------------------------------
      friend istream& operator>>(istream& in,Test<T>& t)      //输入流重载声明及实现
      {
          return in>>t.data;
      }//---------------------------------------------
   private:  
      T data;  
};//-----------------------------------------------------------------      
      
int   main()  
{  
   Test<int> b(3);  
   cout<<b<<'\n';  
   cin>>b;
   cout<<b<<'\n';
   return 0;
}

那么输入输出流重载为什么不能在类内声明,类外实现呢??因为模板比较特殊,若果在模板类外实现重载的话:

template<class T>
ostream& operator<<(ostream& out,Test<T>& t)
{
        return out<<"data   is   "<<t.data;
} //--------------------------------------------

上面正好是函数模板的定义,而我们知道操作符重载函数不是类的成员函数,因此此处相当于定义了一个新的函数模板(不同于类中的friend ostream& operator<<(ostream& out,Test<T>& t) )。但若去掉template<class T> ,函数中的参数Test<T>就不知是什么类型,所以不能在模板类内声明,类外实现操作符重载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,545评论 1 51
  • C++运算符重载-上篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 2,329评论 0 51
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,073评论 0 50
  • 快考试了,题没刷完,且赶上出差。自我安慰一番,带上书和题,高铁上的5个小时可以好好利用起来。虽然出差,可晚上比较空...
    静静安静的炉阅读 184评论 0 0
  • 有时我不知道该如何评价你。说你不懂事吧,有时又挺懂事的,说你懂事吧却又常常把我气个半死。 为什么你和我小时候一点都...
    花开暖暖吖阅读 418评论 3 0