Итак, как предполагали другие, это связано с тем, что std::ifstream
не наследуется от std::fstream
. Вместо этого наследуется от std::istresm
. std::fstream
с другой стороны, наследуется от std::iostream
. Так что вы не можете этого сделать.
Некоторые параметры, которые вам нужно обойти:
- Шаблоны (как уже упоминалось другими):
template <class T> void populate_filehandles(const string &inFileName, T &filehandle)
Перегрузка:
void populate_filehandles(const string &inFileName, std::ifstream &filehandle)
void populate_filehandles(const string &inFileName, std::ofstream &filehandle)
Однако это потребует от вас реализации одной и той же функции дважды. Не обязательно лучшая идея, но будет работать.
Передать флаг
Что-то интересное в std::fstream
заключается в том, что у него есть возможность открывать файл для чтения или записи (или даже того и другого, я думаю). Итак, теоретически вы можете добавить флаг, указывающий, в каком направлении вы хотите его открыть:
void populate_filehandles(const string &inFileName, fstream &filehandle, bool reading) {
if(reading) {
filehandle.open(inFileName, std::ios::in);
} else {
filehandle.open(inFileName, std::ios::out);
}
//...
}