El problema no es que no pueda declarar hacia adelante una clase de plantilla. Sí, necesita conocer todos los parámetros de la plantilla y sus valores predeterminados para poder declararlo correctamente:
namespace std {
template<class T, class Allocator = std::allocator<T>>
class list;
}
Pero hacer incluso una declaración de avance namespace stdestá explícitamente prohibido por el estándar: lo único que se le permite ingresar stdes una especialización de plantilla , comúnmente std::lessen un tipo definido por el usuario. Alguien más puede citar el texto relevante si es necesario.
Solo #include <list>y no te preocupes por eso.
Ah, por cierto, cualquier nombre que contenga guiones bajos dobles está reservado para su uso por la implementación, por lo que debe usar algo como en TEST_Hlugar de __TEST__. No va a generar una advertencia o un error, pero si su programa tiene un choque con un identificador definido por la implementación, no se garantiza que se compile o ejecute correctamente: está mal formado . También están prohibidos los nombres que comienzan con un guión bajo seguido de una letra mayúscula, entre otros. En general, no comience las cosas con guiones bajos a menos que sepa con qué magia está tratando.
std::allocator<T>