#ifndef __TEST__
#define __TEST__
namespace std
{
template<typename T>
class list;
}
template<typename T>
void Pop(std::list<T> * l)
{
while(!l->empty())
l->pop();
}
#endif
y usé esa función en mi main. Me salen errores Por supuesto, sé que hay más parámetros de plantilla parastd::list
(asignador, creo). Pero eso no viene al caso. ¿Tengo que conocer la declaración de plantilla completa de una clase de plantilla para poder reenviarla?
EDITAR: No estaba usando un puntero antes, era una referencia. Lo probaré con el puntero.
std::allocator<T>
__TEST__
es un identificador reservado, no lo use .Respuestas:
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:
Pero hacer incluso una declaración de avance
namespace std
está explícitamente prohibido por el estándar: lo único que se le permite ingresarstd
es una especialización de plantilla , comúnmentestd::less
en 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_H
lugar 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.fuente
namespace std
cierto?#pragma once
lugar de los # ifdef? Es compatible con la mayoría de los compiladores en estos días.#pragma
, es por eso. Aunque es una opción.Resolví ese problema.
Estaba implementando una capa OSI (ventana deslizante, Nivel 2) para una simulación de red en C ++ (Eclipse Juno). Tenía marcos (plantilla
<class T>
) y sus estados (patrón de estado, declaración directa).La solución es la siguiente:
En el
*.cpp
archivo, debe incluir el archivo de encabezado que reenvía, es decirSu cpp:
Y ... otra clase.
fuente
using namespace
en un archivo de encabezado es una práctica muy mala porque evita que cualquiera que use ese archivo de encabezado pueda usar nombres locales que de otro modo serían válidos. Básicamente derrota todo el punto de los espacios de nombres.La declaración directa debe tener una lista completa de argumentos de plantilla especificada.
fuente
hay una alternativa limitada que puedes usar
encabezamiento:
cpp:
no probado en programas reales, así que espere que no sea perfecto.
fuente