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>>")";

胡说八道:您正试图将流“是”的信息移动到常量字符串“)”中。我想你想要的是这样的:

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

正如其他人指出的那样,您正在尝试读取提取器中的文字。我建议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 回答