ОК, сначала немного ворча :-) Вы говорите, что хотите. Вы написали, как вы пытаетесь. Отлично. Я думаю, что результат не тот, что вы ожидали. Но вы не сказали нам, какой результат вы получаете и почему вы разочарованы этим. Когда я смотрю на ваш код, он не должен компилироваться. Проблема здесь:
istream& PersonData::read(std::istream& is)
{
is >> fId;
return is;
}
Я не вижу ни одного оператора >>, определенного для типа PersonId, а fId имеет тип PersonId. Я прав? Или, может быть, где-то определен оператор >>, и вы не просто вставили его в свой вопрос? Мой хрустальный шар неясен.
Если я правильно угадал, решение дает Дэйв Гэмбл:
istream& operator >> (istream& is, PersonId &p)
{
is >> p.fId;
return is;
}
Вы написали "все еще получаете ошибки при попытке доступа к PersonData". Кажется, на этот раз хрустальный шар Дейва тоже неясен, он не может сказать, какие у вас проблемы. Я тоже не могу. Вы должны либо предоставить нам детали, либо отправить нам лучшие хрустальные шары. Может быть, вы пропустили его другой совет: «Также исправьте cout, чтобы использовать p [i] .fId.fId.» Это значит, что вместо написания
cout << "PersonData [" << i << "] is " << p[i] << endl;
вы должны написать
cout << "PersonData [" << i << "] is " << p[i].fId.fId << endl;
Может быть и другая проблема - вы не имеете в виду соответственно членов пространства имен std - иногда вы пишете istream, а иногда пишете std :: istream, вместо std :: endl пишете endl. Возможно, поиск Кенига сработает для вас, я не очень хорош, но добавление префикса std :: может помочь (конечно, если это ваша проблема).