2

<< 演算子をオーバーロードしている 2 つのインスタンスがあり、常に下に表示されている最初のものにデフォルト設定されています。カスタム クラスの Shape で認識される 2 番目の関数を取得する方法はありますか?

ありがとうございました、

ジョン

最初の過負荷:

    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;
    }

2 番目の過負荷:

    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

2つの関数の名前と署名は同じです。テンプレートパラメータ名(T、SHAPE)のみが異なります。これが、コンパイラが同じ関数を再定義していると文句を言う理由です。署名を変更するか、を追加する必要がありますstd::enable_if

于 2012-07-28T06:21:36.127 に答える
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 に答える
0

私はテンプレートの専門化の専門家ではありません。ただし、別の解決策はShape::operator<<()、すべての出力を含めるように変更することです。

于 2012-07-24T17:03:48.277 に答える