1

演算子のオーバーロードを学習しようとしていますが、最初の試行でエラーが発生しました。

template<typename T>
class Pair
{
public:
    T x; T y;
    Pair(T x, T y): x(x), y(y){};
    ~Pair(){};

    /* data */
};
template<typename T>
ostream& operator<<(ostream &os, const Pair<T> &p)
{
    return os<<"("<<p.x<<", "<<p.y<<")";
}

template<typename T>
istream& operator>>(istream &is, Pair<T> &p)
{
    return is>>"(">>p.x>>", ">>p.y>>")";
}

次のことができるようになりたいです。

Pair<int> p;
cin>>p;
cout<<p;

また、Pairオブジェクトに入力を与えるということは、 の(1, 2)cinに を生成する入力として与えることができることを意味しますPair<int>

でコンパイル時エラーが発生しis>>"("ます。これを修正する方法は何ですか?

4

4 に答える 4

2
return is>>"(">>p.x>>", ">>p.y>>")";

ナンセンスです: ストリーム 'is' の情報を定数文字列 ")" に移動しようとしています。あなたが望むのはこれだと思います:

template<typename T>
istream& operator>>(istream &is, Pair<T> &p)
{
   is.seekg(1, std::ios::cur); // skip 1 char, "("
   is >> p.x;
   is.seekg(2, std::ios::cur); // skip 2 chars, ", "
   is >> p.y;
   is.seekg(1, std::ios::cur); // skip 1 char, ")"
}
于 2013-05-27T17:16:21.720 に答える
2

"("文字列リテラルとを読み込もうとしています")"。それをしてはいけない。

これを試して:

template<typename T>
istream& operator>>(istream &is, Pair<T> &p)
{
    return is >> p.x>> p.y;
}
于 2013-05-27T17:18:00.890 に答える
1

他の人が指摘したように、エクストラクタでリテラルに読み込もうとしています。最初にa を読んでcharと比較することで、これを修正することをお勧めし'('ます。失敗した場合はエラーを通知し、それ以外の場合Tはプロセスを抽出して繰り返します。

コード内:

template <typename T>
istream& operator>> (istream &is, Pair<T> &p)
{
  char c;
  if (!(is >> c)) return is;
  if (c != '(') {
    is.setstate(is.failbit);
    return is;
  }
  if (!(is >> p.x >> c)) return is;
  if (c != ',') {
    is.setstate(is.failbit);
    return is;
  }
  if (!(is >> p.x >> c)) return is;
  if (c != ')') {
    is.setstate(is.failbit);
  }
  return is;
}
于 2013-05-27T17:30:29.950 に答える
0

入力演算子のオーバーロードで "(" 文字列リテラルを読み取る必要はありません。px と py を読み取るだけです。

于 2013-05-27T17:19:16.047 に答える