我正在尝试学习运算符重载,并且在第一次尝试时出错。
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>>"("
收到编译时错误。有什么方法可以解决这个问题?
答案 0 :(得分: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, ")"
}
答案 1 :(得分:2)
您正在尝试阅读字符串文字"("
和")"
。你不能这样做。
试试这个:
template<typename T>
istream& operator>>(istream &is, Pair<T> &p)
{
return is >> p.x>> p.y;
}
答案 2 :(得分: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;
}
答案 3 :(得分:0)
您不必阅读“(”输入操作符重载中的字符串文字,只需读取p.x和py。