Чтение файла до пустой строки - PullRequest
2 голосов
/ 11 декабря 2010

После прочтения ответа Джерри Коффина на этот вопрос Я скопировал его код в свой редактор, и после некоторых незначительных правок он скомпилировался и работал так, как должен.

Вот код после изменений:

 #include <iostream>
 #include <string>
 #include <istream>
 #include <fstream>

class non_blank {
private:
 std::string data_;

 friend std::istream& operator>> (std::istream &is, non_blank &n) {
  std::getline(is, n.data_);

  if (n.data_.length() == 0) {
   is.setstate(std::ios::failbit);
  }
  return is;
 }

public:
 operator std::string() const {
  return data_;
 }
};


int main(int, char *[]) {

 non_blank line;
 std::ifstream ifs("teste.txt");

 while(ifs >> line) {
  //std::cout << line; <----- error
  std::string s = line;
  std::cout << s << std::endl;
 }

 return 0;
}
  • У меня возникла ошибка при попытке использовать переменную non_blank в выражении std::cout <<....Разве я не смогу использовать переменную типа non_blank в любом месте, где бы я использовал std :: string?Разве это не цель оператора преобразования / преобразования? ответ

  • Почему я не могу получить доступ к закрытой переменной string::data_ непосредственно в определении operator >>?

Вот ошибка, которую я получил:

..\main.cpp: In function `std::istream& operator>>(std::istream&, non_blank&)':
..\main.cpp:21: error: invalid use of non-static data member `non_blank::data_'
..\main.cpp:26: error: from this location

1 Ответ

1 голос
/ 11 декабря 2010

Разве я не смогу использовать переменную типа non_blank в любом месте, где бы я использовал std :: string?Разве это не часть оператора приведения?

Не совсем.Если компилятор видит, что вы делаете что-то, что, как он знает, требует std :: string, он может вызвать ваш оператор преобразования, чтобы получить его.Но в случае с оператором ostream << у него нет ни одной конкретной функции для вызова, а довольно много их, все разные, и ни одна из них не соответствует точно реальному типу, который вы хотите напечатать.Таким образом, он перечисляет целую кучу кандидатов, ни один из которых не является достаточно сильным совпадением.Вам нужно определить оператор ostream << для вашего типа, чтобы он печатался так, как должен. </p>

Что касается вашего оператора >>, вы должны сделать его не членом вашего класса.Объявите его как друга в объявлении класса, если нужно, но напишите саму функцию снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...