C ++ - Как я неправильно использую игнорирование с istringstream?

Я планирую в основном коде попросить пользователя ввести номер телефона в форме (800) 555-1212, который будет отправлен в мой конструктор PhoneNumber, а затем отправлен в setPhoneNumber для его разбиения, установки моих личных переменных и анализа ошибок. Кроме того, я хотел написать свой код setPhoneNumber, чтобы он учитывал ошибки пользователя в исходном вводе. Мой код PhoneNumber.h:

// PhoneNumber.h
#ifndef PHONENUMBER_H
#define PHONENUMBER_H

#include <string>

class PhoneNumber {
   private:
      short areaCode;
      short exchange;
      short line;
   public:
      PhoneNumber(std::string number);
      void setPhoneNumber(std::string number);
      void printPhoneNumber() const;
};
#endif

А вот мой код PhoneNumber.cpp

// PhoneNumber.cpp
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <cctype>
#include "PhoneNumber.h"

PhoneNumber::PhoneNumber(std::string number) {
   setPhoneNumber(number);
}

void PhoneNumber::setPhoneNumber(std::string number) {
   bool areaCodeDone = false;
   bool exchangeDone = false;
   int length = number.length();

   std::istringstream iss(number);
   for (int i = 0; i < length; i++) {
      if (! areaCodeDone) {
         if (! std::isdigit(number[i])) {
            std::string str;
            iss >> std::ignore();
         }
         else {
            iss >> std::setw(3) >> areaCode;
            areaCodeDone = true;
         }
      }
      else if (! exchangeDone) {
         if (! std::isdigit(number[i])) {
            iss >> std::ignore();
         }
         else {
            iss >> std::setw(3) >> exchange;
            exchangeDone = true;
         }
      }
      else {
         if (! std::isdigit(number[i])) {
            iss >> std::ignore();
         }
         else {
            if (length - i < 4) {
               throw std::invalid_argument("Something wrong with phone number entry.");
            }
            else {
               iss >> std::setw(4) >> line;
            }
         }
      }
   }
}

Ошибки, которые я получаю, находятся в моих строках с std :: ignore, но я не знаю, как я использую его неправильно. Ошибка компилятора g ++:

PhoneNumber.cpp: 23: 32: ошибка: нет совпадения для вызова ‘(const std :: _ Swallow_assign) ()’

iss >> std :: ignore ();

Кто-нибудь может проанализировать и помочь, пожалуйста?


person William S    schedule 12.10.2019    source источник


Ответы (2)


std::ignore() преследует совсем другую цель, нежели то, что вы надеетесь достичь. Вместо того

iss >> std::ignore();

использовать

iss.ignore();

Вы можете увидеть документацию по std::istream::ignore() и примеры использования по адресу https://en.cppreference.com/w/cpp/io/basic_istream/ignore.

person R Sahu    schedule 12.10.2019

std::ignore не выполняет то, что вы думаете: он используется для кортежей.

Вместо этого то, что вы ищете, на самом деле называется std::istream::ignore(). Вместо этого вы бы использовали это так:

iss.ignore();

Для получения дополнительной информации о std::istream::ignore() вы можете прочитать этот вопрос.

person Community    schedule 12.10.2019