
C/C++
Отсутствуют экземпляры перегруженная функция, почему подсвечивает getline()?

Учебник настолько старый, что ему место в топке. За это время много воды утекло. Моя скромная попытка переписать данный пример в духе времени.
#include <iostream>
#include <string>
#include <regex>
using namespace std;
class PhoneNumber {
string format;
friend istream& operator>>(istream& inp, PhoneNumber& pn) {
string line;
getline(inp, line);
char front = line.front();
smatch sm;
const regex re(R"(\d+)");
pn.format = front == '+' ? "+" : "(";
if (regex_search(line, sm, re)) {
pn.format += sm.str();
line = sm.suffix();
if (front != '+') pn.format += ") ";
else {
pn.format += " (";
if (regex_search(line, sm, re)) {
pn.format += sm.str() + ") ";
line = sm.suffix();
}
}
}
while (regex_search(line, sm, re)) {
pn.format += sm.str() + '-';
line = sm.suffix();
}
pn.format.pop_back();
return inp;
}
friend ostream& operator<<(ostream& out, const PhoneNumber& pn) {
return out << pn.format;
}
};
int main() {
system("chcp 1251 > nul");
PhoneNumber pn;
cout << "Введите номер телефона в формате (123) 456-7890: ";
cin >> pn;
cout << "Вы ввели: ";
cout << pn << '\n';
cout << "Введите номер телефона в формате (123) 456-78-90: ";
cin >> pn;
cout << "Вы ввели: ";
cout << pn << '\n';
cout << "Введите номер телефона в формате +7 (123) 456-78-90: ";
cin >> pn;
cout << "Вы ввели: ";
cout << pn << '\n';
system("pause > nul");
}
#include <iostream>
#include <string>
#include <regex>
using namespace std;
class PhoneNumber {
string format;
friend istream& operator>>(istream& inp, PhoneNumber& pn) {
string line;
getline(inp, line);
char front = line.front();
smatch sm;
const regex re(R"(\d+)");
pn.format = front == '+' ? "+" : "(";
if (regex_search(line, sm, re)) {
pn.format += sm.str();
line = sm.suffix();
if (front != '+') pn.format += ") ";
else {
pn.format += " (";
if (regex_search(line, sm, re)) {
pn.format += sm.str() + ") ";
line = sm.suffix();
}
}
}
while (regex_search(line, sm, re)) {
pn.format += sm.str() + '-';
line = sm.suffix();
}
pn.format.pop_back();
return inp;
}
friend ostream& operator<<(ostream& out, const PhoneNumber& pn) {
return out << pn.format;
}
};
int main() {
system("chcp 1251 > nul");
PhoneNumber pn;
cout << "Введите номер телефона в формате (123) 456-7890: ";
cin >> pn;
cout << "Вы ввели: ";
cout << pn << '\n';
cout << "Введите номер телефона в формате (123) 456-78-90: ";
cin >> pn;
cout << "Вы ввели: ";
cout << pn << '\n';
cout << "Введите номер телефона в формате +7 (123) 456-78-90: ";
cin >> pn;
cout << "Вы ввели: ";
cout << pn << '\n';
system("pause > nul");
}
Неправильно организован ввод через getline
Если введено большее число символов, чем принимает строка гетлайна, то статус ввода будет с ошибкой. Поэтому только первый гетлайн срабатывает - остальные будут в ошибке.
Нужно после каждого гетлайна добавить input.clear();
Если введено большее число символов, чем принимает строка гетлайна, то статус ввода будет с ошибкой. Поэтому только первый гетлайн срабатывает - остальные будут в ошибке.
Нужно после каждого гетлайна добавить input.clear();
Похожие вопросы
- Я так и не понял, что означает return и почему надо ставить именно 0, а не любое другое значение. Ещё кое-что о функции.
- Не могу разобраться. Функция удаления отрицательных элементов вектора
- Как в функции распечатать двумерный динамический массив в Си
- Передача в метод класса указателя на функцию C++
- Что делаешь getline в С++? Простым языком и с примером, если можно
- Возвращение функции return func(); (Си)
- Почему динамический массив напрямую в функцию передать нельзя, а динамический массив указателей можно?
- Как завершить условие в функции?
- Как работать с элементами динамического массива из функции?
- Что за число хранится в имени функции? (Си)