运营商<<超载 [英] Operator << overloading

查看:117
本文介绍了运营商<<超载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理我的项目,我想重载操作符<< ,它应该在控制台上打印出我的对象。

Object被称为config,在它的模板类中有4个数组,称为 attribute1 attribute2 attribute3 attribute4

I'm working on my project and I want to overload operator << which should print out my object on console.
Object is called "config" and in its template class it has 4 arrays called attribute1, attribute2. attribute3 and attribute4.

到目前为止,我已经试试这个:

So far I've tried this :

#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

template<typename T> class config
{
    T *attribute1, *attribute2, *attribute3, *attribute4;
    string attribName1, attribName2, attribName3, attribName4;
  public:
    config(void)
    {
      attribute1 = new T[3];
      attribute2 = new T[3];
      attribute3 = new T[3];
      attribute4 = new T[3];
    }   

    ~config(void)//destruktor
     {
       delete [] attribute1, attribute2, attribute3, attribute4;
     }

    //operatory
    friend ostream& operator<<(ostream &out, const config<T> &c); 
};//class ends

template <typename T> ostream& operator<<(ostream &out, const config<T> &c)
{
  for(int i=0;i<3;i++)
  {
    out<<c.attribute1[i]<<c.attribute2[i]<<c.attribute3[i]<<c.attribute2[i];
  }
  return out;
}

每当我尝试编译它时,都会出现某种奇怪的错误,但我知道问题出在操作员身上。

Whenever I try to compile it, it gives some kind of weird error, but I know the problem is in the operator.

这是它给出的错误:

This is the error it gives :

Error   1   error LNK2001: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class config<double> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$config@N@@@Z)    D:\Docs\Visual Studio 2010\Projects\project_v2.obj  project_v2



and:

Error   2   error LNK1120: 1 unresolved externals   D:\Docs\Visual Studio 2010\Projects\project_v2.exe  project_v2

未指定行或列。

推荐答案

这是解决问题的一种方法。

Here's one way to solve the problem.


  1. 声明运算符< config 之前。为了声明函数,你必须转发声明类模板。

  1. Declare the operator<< function first, before config is defined. In order to declare the function, you have to forward declare the class template.

template <typename T> class config;
template <typename T> std::ostream& operator<<(std::ostream &out,
                                               const config<T> &c);


  • 在类中,使用 T 作为模板参数。

    friend ostream& operator<< <T>(ostream &out, const config &c);
    // Notice  this            ^^^^
    // This makes sure that operator<< <int> is not a friend of
    // config<double>. Only operator<< <double> is a friend of
    // config<double>
    


  • 以下是一个包​​含这些更改的工作程序: / p>

    Here's a working program with those changes:

    #include <string>
    #include <iostream>
    
    template <typename T> class config;
    template <typename T> std::ostream& operator<<(std::ostream &out,
                                                   const config<T> &c);
    
    template <typename T> class config
    {
        T *attribute1, *attribute2, *attribute3, *attribute4;
        std::string attribName1, attribName2, attribName3, attribName4;
      public:
        config(void)
        {
          attribute1 = new T[3];
          attribute2 = new T[3];
          attribute3 = new T[3];
          attribute4 = new T[3];
        }   
    
        ~config(void)//destructor
         {
           delete [] attribute1;
           delete [] attribute2;
           delete [] attribute3;
           delete [] attribute4;
         }
    
        //operator
        friend std::ostream& operator<< <T>(std::ostream &out,
                                            const config &c);
    };
    
    template <typename T> std::ostream& operator<<(std::ostream &out,
                                                   const config<T> &c)
    {
       for(int i=0;i<3;i++)
       {
          out << c.attribute1[i] << " "
              << c.attribute2[i] << " "
              << c.attribute3[i] << " "
              << c.attribute2[i] << std::endl;
       }
       return out;
    }
    
    int main()
    {
       config<double> x;
       std::cout << x << std::endl;
    }
    

    输出:

    Output:

    
    0 0 0 0
    0 0 0 0
    0 0 0 0
    
    

    这篇关于运营商&lt;&lt;超载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆