std::stack
(как и все контейнеры STL) требует, чтобы его содержащийся тип был «присваиваемым». В языке STL это означает, что он должен иметь конструктор копирования и operator=
. std::ifstream
не имеет ни одного из них.
Вы можете себе представить, почему вы не хотите иметь возможность копировать и назначать потоки ввода / вывода; семантика того, что должно происходить при наличии двух копий одного потока, не очевидна. Должно ли чтение или запись в одну копию влиять на положение другой копии? Должно ли закрытие одного потока закрывать другой? и т.д.
Если вы хотите иметь «контейнер std::ifstream
с», то, что вы действительно должны сделать, это «контейнер std::ifstream*
с». Неконстантные указатели всегда назначаются. Предостережение заключается в том, что в этом случае, конечно, вы должны убедиться, что удалили указатели самостоятельно, прежде чем уничтожить контейнер, поскольку контейнер не сделает этого за вас.