Проблема не в том, что вы не можете заранее объявить класс шаблона. Да, вам нужно знать все параметры шаблона и их значения по умолчанию , чтобы иметь возможность правильно объявить его вперед:
namespace std {
template<class T, class Allocator = std::allocator<T>>
class list;
}
Но даже сделать такое предварительное объявление в namespace std
прямо запрещено стандартом: только вещь, которую вы можете поместить в std
, является шаблоном специализация , обычно std::less
для пользовательского типа. При необходимости кто-то другой может процитировать соответствующий текст.
Просто #include <list>
и не беспокойтесь об этом.
Кстати, любое имя, содержащее двойное подчеркивание, зарезервировано для использования реализацией, поэтому вы должны использовать что-то вроде TEST_H
вместо __TEST__
. Он не будет генерировать предупреждение или ошибку, но если в вашей программе есть конфликт с идентификатором, определяемым реализацией, то не гарантируется, что он будет правильно скомпилирован или запущен: это плохо сформировано . Также запрещены имена, начинающиеся с подчеркивания, за которым следует, помимо прочего, заглавная буква. В общем, не начинайте с подчеркивания, если не знаете, с какой магией вы имеете дело.