#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
e usei essa função no meu principal. Eu recebo erros. Claro, eu sei que existem mais parâmetros de modelo para std::list
(alocador, eu acho). Mas isso não vem ao caso. Preciso conhecer a declaração de modelo completa de uma classe de modelo para poder encaminhá-la?
Edição: Eu não estava usando um ponteiro antes - era uma referência. Vou experimentar com o ponteiro.
std::allocator<T>
__TEST__
é um identificador reservado, não o use .Respostas:
O problema não é que você não pode declarar adiante uma classe de modelo. Sim, você precisa conhecer todos os parâmetros do modelo e seus padrões para poder declara-lo corretamente corretamente:
Mas fazer até mesmo uma declaração encaminhada
namespace std
é explicitamente proibida pelo padrão: a única coisa que você pode inserirstd
é uma especialização de modelo , geralmentestd::less
em um tipo definido pelo usuário. Outra pessoa pode citar o texto relevante, se necessário.Somente
#include <list>
e não se preocupe com isso.Ah, aliás, qualquer nome que contenha sublinhado duplo é reservado para uso pela implementação; portanto, você deve usar algo como em
TEST_H
vez de__TEST__
. Não vai gerar um aviso ou erro, mas se o seu programa tiver um conflito com um identificador definido pela implementação, não será garantido que ele seja compilado ou executado corretamente: está mal formado . Também são proibidos nomes que começam com um sublinhado seguido por uma letra maiúscula, entre outros. Em geral, não comece as coisas com sublinhados, a menos que você saiba com que mágica está lidando.fonte
namespace std
btw?#pragma once
em vez dos # ifdef's. É suportado pela maioria dos compiladores atualmente.#pragma
, é por isso. Embora seja uma opção.Eu resolvi esse problema.
Eu estava implementando uma camada OSI (janela deslizante, nível 2) para uma simulação de rede em C ++ (Eclipse Juno). Eu tinha quadros (modelo
<class T>
) e seus estados (padrão de estado, declaração direta).A solução é a seguinte:
No
*.cpp
arquivo, você deve incluir o arquivo de cabeçalho que encaminhar, ou sejaSeu cpp:
E ... outra aula.
fonte
using namespace
em um arquivo de cabeçalho é uma prática muito ruim, pois impede que qualquer pessoa que use esse arquivo de cabeçalho possa usar nomes locais que, de outra forma, seriam válidos. Basicamente, derrota todo o ponto dos espaços para nome.A declaração de encaminhamento deve ter a lista completa de argumentos do modelo especificada.
fonte
existe uma alternativa limitada que você pode usar
cabeçalho:
cpp:
não testado em programas reais, portanto, espere que não seja perfeito.
fonte