重载运算符的顺序

时间:2012-07-24 16:21:07

标签: c++ operator-overloading

我有两个实例,我正在重载<<运算符,它总是默认为下面显示的第一个是否有任何方法可以为自定义类Shape识别第二个函数?

谢谢,

约翰

首次超载:

    template <class T>
    ostream & operator << (ostream & out, vector <T> & vec)
    {
      for (unsigned int i = 0;i<vec.size()-1; i++) {
        out << vec[i] << " ";
      }
      out << vec[vec.size() - 1];

      return out;
    }

第二次超载:

    ostream & operator << (ostream & out, vector <Shape> & vec)
    {
      for (unsigned int i = 0;i<vec.size(); i++)
      {
        out << "##" << vec[i].get_shape_type << i << endl << vec[i] << endl;
      }
      return out;
    }

编辑2012年7月25日:

我添加了相同的文件

    #ifndef _UTILS_H_
    #define _UTILS_H_
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include "Shape.H"

    using namespace std;

    template <class T>
    ostream & operator << (ostream & out, vector <T> & vec)
    {
        for (unsigned int i = 0;i<vec.size()-1; i++) {
            out << vec[i] << " ";
        }
        out << vec[vec.size() - 1];

        return out;
    }

    template <class Shape>
    ostream & operator << (ostream & out, vector <Shape> & vec)
    {
        for (unsigned int i = 0;i<vec.size(); i++)
        {
            out << "## " <<vec[i];
        }
        return out;
    }
    #endif

并尝试编译,我收到此错误

../include/utils.H:22:11:错误:重新定义'template std :: ostream&amp; operator&lt;&lt;(std :: ostream&amp;,std :: vector&amp;)' ../include/utils.H:11:11:错误:'template std :: ostream&amp;先前在此声明的运算符&lt;&lt;(std :: ostream&amp;,std :: vector&amp;)'

4 个答案:

答案 0 :(得分:1)

您的两个功能具有相同的名称和签名。只有模板参数名称(T,SHAPE)不同。这就是编译器抱怨您正在重新定义相同功能的原因。您需要使签名不同或添加std::enable_if

答案 1 :(得分:1)

我认为编辑中的特化语法是错误的。要正确执行模板特化,而不是:

template <class Shape>
ostream & operator << (ostream & out, vector <Shape> & vec)

你需要:

template <>
ostream & operator << <Shape> (ostream & out, vector <Shape> & vec)

请参阅this ref

答案 2 :(得分:0)

我不是模板专业化方面的专家。但是,另一种解决方案是修改Shape::operator<<()以包含所有输出。

答案 3 :(得分:0)

您的'重载'基本上与具有不同命名的模板参数的功能相同,因此重新声明错误。你必须使它们实际超载。 Shape版本不一定是模板,只是一个函数。你也许想通过const引用传递vector:

ostream & operator << (ostream & out, vector<Shape> const& vec)
{
    for (unsigned int i = 0;i<vec.size(); i++)
    {
        out << "## " <<vec[i];
    }
    return out;
}