2

我有两个实例,我重载了 << 运算符,它始终默认为下面显示的第一个实例。有什么方法可以让自定义类 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:错误:重新定义'模板 std::ostream& operator<<(std::ostream&, std::vector&)' ../include/utils.H:11:11 : 错误: 'template std::ostream& operator<<(std::ostream&, std::vector&)' 之前在这里声明

4

4 回答 4

1

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

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

你需要:

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

请参阅此参考

于 2013-05-28T20:14:21.503 回答
1

您的两个函数具有相同的名称和签名。只有模板参数名称(T、SHAPE)不同。这就是为什么编译器抱怨你正在重新定义相同的函数。您需要使签名不同或添加std::enable_if.

于 2012-07-28T06:21:36.127 回答
0

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

于 2012-07-24T17:03:48.277 回答
0

您的“重载”基本上是具有不同命名模板参数的相同函数,因此重新声明错误。您必须使它们成为实际的重载。Shape版本不需要是模板,只是一个函数。此外,您可能希望通过 const 引用传递向量:

ostream & operator << (ostream & out, vector<Shape> const& vec)
{
    for (unsigned int i = 0;i<vec.size(); i++)
    {
        out << "## " <<vec[i];
    }
    return out;
}
于 2013-05-28T19:34:03.260 回答