C++ - 我如何误用 istringstream 忽略?

C++ - How am I misusing ignore with istringstream?

我计划在主代码中要求用户以 (800) 555-1212 的形式输入 phone 号码,这将被发送到我的 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: error: no match for call to ‘(const std::_Swallow_assign) ()’

iss >> std::ignore();

std::ignore() 的目的与您希望达到的目的截然不同。而不是

iss >> std::ignore();

使用

iss.ignore();

您可以在 https://en.cppreference.com/w/cpp/io/basic_istream/ignore 查看 std::istream::ignore() 的文档和示例用法。

std::ignore 并不像您想象的那样:它用于元组。

相反,您要查找的实际上是 std::istream::ignore()。你会像这样使用它:

iss.ignore();

有关std::istream::ignore()的更多信息,您可以阅读this question.