Эта конкретная форма ошибки часто вызвана тем, что тип не определен (по крайней мере, когда код выглядит синтаксически правильным), в этом случае, вероятно, класс ReadWords, но, возможно, также std :: string.
Вам нужно включить, чтобы получить std :: string, как написали другие авторы, но также и вашу охрану
#ifndef READWORDS_H
#define READWORDS_H
почти наверняка конфликтует с охранником в ReadWords.h. Вы должны убедиться, что ваши охранники различны в разных заголовочных файлах, иначе вы получите такие конфликты. Вы должны сменить охрану на что-то вроде
#ifndef READPUNCTWORDS_H
#define READPUNCTWORDS_H
// ...
#endif
На самом деле, лучше иметь еще больше многословных охранников, чтобы они не конфликтовали. Мы используем охранники формы
#ifndef MODULE_OR_PATH_FILE_H_INCLUDED
#define MODULE_OR_PATH_FILE_H_INCLUDED
// ...
#endif
Это гарантирует, что различные модули или библиотеки с одинаково названными заголовками не будут конфликтовать, в конце включена вещь INCLUDED - моя собственная слабость, которая делает охрану немного более читабельной.
Также неправильно размещать объявление «using» в заголовочном файле, поскольку оно помещает (потенциально нежелательные или конфликтующие) символы в глобальное пространство имен везде, где вы включаете заголовок. Лично я предпочитаю сохранять пространство имен для ясности или псевдоним его в файлах cpp, если оно длинное, например
namespace fs = boost::filesystem;