C ++ Памылка перагрузкі аператара: ня падыходзіць для «аператара >>» у «з'яўляецца >>" ( "»

Я спрабую навучыцца перагружаць аператар і я атрымаў памылку на маёй першай спробы.

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

    /* data */
};
template
ostream& operator<<(ostream &os, const Pair &p)
{
    return os<<"("<<", "<<")";
}

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

Я хачу, каб мець магчымасць зрабіць наступнае:

Pair p;
cin>>p;
cout<

And giving input for Pair object means being able to give (1, 2) as input which after cin, produces a Pair.

I get a compile time error at is>>"(". What is the way to correct this?

1
@LuchianGrigore: Я не думаю, што гэта мае значэнне. Яны спрабуюць ўставіць у радок літаральнага ...
дададзена аўтар Andy Prowl, крыніца
@LuchianGrigore: Я не думаю, што гэта мае значэнне. Яны спрабуюць ўставіць у радок літаральнага ...
дададзена аўтар Andy Prowl, крыніца

8 адказы

Вы спрабуеце прачытаць у радковых литералов «(» і «)» . Вы не можаце зрабіць гэта.

Паспрабуйце гэта:

template
istream& operator>>(istream &is, Pair &p)
{
    return is >> p.x>> p.y;
}
2
дададзена
то я павінен даць ўвод як «1 2», а я хачу, каб мець магчымасць чытаць «(1, 2)» у аб'ект Пара
дададзена аўтар prongs, крыніца
@juanchopanza З іншага боку, піша ўстаўкі круглыя ​​дужкі і коскі. Было б дзіўна для экстрактара пацярпець няўдачу на такім ўваходзе.
дададзена аўтар Angew, крыніца
@prongs добра, што гэта іншае пытанне, які вы не пазначылі ў сваім пытанні. Вам трэба разабраць радок уводу першай.
дададзена аўтар juanchopanza, крыніца

Вы спрабуеце прачытаць у радковых литералов «(» і «)» . Вы не можаце зрабіць гэта.

Паспрабуйце гэта:

template
istream& operator>>(istream &is, Pair &p)
{
    return is >> p.x>> p.y;
}
2
дададзена
то я павінен даць ўвод як «1 2», а я хачу, каб мець магчымасць чытаць «(1, 2)» у аб'ект Пара
дададзена аўтар prongs, крыніца
@juanchopanza З іншага боку, піша ўстаўкі круглыя ​​дужкі і коскі. Было б дзіўна для экстрактара пацярпець няўдачу на такім ўваходзе.
дададзена аўтар Angew, крыніца
@prongs добра, што гэта іншае пытанне, які вы не пазначылі ў сваім пытанні. Вам трэба разабраць радок уводу першай.
дададзена аўтар juanchopanza, крыніца
return is>>"(">>p.x>>", ">>p.y>>")";

гэта нонсэнс: вы спрабуеце перанесьці інфармацыю патоку «з'яўляецца» ў канстантнасцю радок «)». Я думаю, што вы хочаце гэта:

template
istream& operator>>(istream &is, Pair &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, ")"
}
2
дададзена
Гэта таксама будзе прымаць [1df2]
дададзена аўтар prongs, крыніца
Вашае рэдагаваньне было пасля майго адказу, і гэта патрабаванне не з'яўляецца ў гэтым пытанні.
дададзена аўтар JRG, крыніца
return is>>"(">>p.x>>", ">>p.y>>")";

гэта нонсэнс: вы спрабуеце перанесьці інфармацыю патоку «з'яўляецца» ў канстантнасцю радок «)». Я думаю, што вы хочаце гэта:

template
istream& operator>>(istream &is, Pair &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, ")"
}
2
дададзена
Гэта таксама будзе прымаць [1df2]
дададзена аўтар prongs, крыніца
Вашае рэдагаваньне было пасля майго адказу, і гэта патрабаванне не з'яўляецца ў гэтым пытанні.
дададзена аўтар JRG, крыніца

Як ужо адзначалася, вы спрабуеце прачытаць у литералов ў экстрактар. Я прапаную выправіць гэтую праблему, чытаючы сімвал першы і параўноўваючы яго з «(» . Вы сігналізаваць пра памылку, калі гэта не атрымоўваецца, у адваротным выпадку выняць T </код > і паўтарыць працэс.

У кодзе:

template 
istream& operator>> (istream &is, Pair &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;
}
1
дададзена

Як ужо адзначалася, вы спрабуеце прачытаць у литералов ў экстрактар. Я прапаную выправіць гэтую праблему, чытаючы сімвал першы і параўноўваючы яго з «(» . Вы сігналізаваць пра памылку, калі гэта не атрымоўваецца, у адваротным выпадку выняць T </код > і паўтарыць працэс.

У кодзе:

template 
istream& operator>> (istream &is, Pair &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;
}
1
дададзена

Вы не павінны чытаць «(» радковага литерала ў аператары ўводу перагружаць толькі для чытання p.x і ру.

0
дададзена

Вы не павінны чытаць «(» радковага литерала ў аператары ўводу перагружаць толькі для чытання p.x і ру.

0
дададзена