Come inoltrare dichiarare una class template nello spazio dei nomi std?

#ifndef __TEST__ #define __TEST__ namespace std { template class list; } template void Pop(std::list * l) { while(!l->empty()) l->pop(); } #endif 

e ho usato quella funzione nel mio principale. Ottengo errori Certo, so che ci sono più parametri per template per std::list (penso che sia l’allocator). Ma questo è oltre il punto. Devo conoscere la dichiarazione completa del template di una class template per poterla inoltrare dichiararla?

EDIT: non stavo usando un puntatore prima – era un riferimento. Lo proverò con il puntatore.

Il problema non è che non è ansible inoltrare una class template. Sì, è necessario conoscere tutti i parametri del modello e le loro impostazioni predefinite per poterli inoltrare-dichiarare correttamente:

 namespace std { template> class list; } 

Ma rendere anche tale dichiarazione namespace std nello namespace std è esplicitamente vietato dallo standard: l’ unica cosa che è ansible inserire in std è una specializzazione template, comunemente std::less su un tipo definito dall’utente. Qualcun altro può citare il testo pertinente, se necessario.

Solo #include e non ti preoccupare.

Oh, per inciso, qualsiasi nome che contenga caratteri di sottolineatura doppia è riservato per l’implementazione, quindi dovresti usare qualcosa come TEST_H invece di __TEST__ . Non genererà un avviso o un errore, ma se il tuo programma ha uno scontro con un identificatore definito dall’implementazione, non è garantito che sia compilato o eseguito correttamente: è mal formato . Sono inoltre vietati nomi che iniziano con un trattino basso seguito da una lettera maiuscola, tra gli altri. In generale, non iniziare le cose con caratteri di sottolineatura a meno che tu non sappia di quale magia stai trattando.

Ho risolto il problema.

Stavo implementando un OSI Layer (slider window, Level 2) per una simulazione di rete in C ++ (Eclipse Juno). Avevo i frame (template ) e i suoi stati (pattern state, forward statement).

La soluzione è la seguente:

Nel file *.cpp , devi includere il file di intestazione che hai inoltrato, es

 ifndef STATE_H_ #define STATE_H_ #include  #include "Frame.h" template  class LinkFrame; using namespace std; template  class State { protected: LinkFrame *myFrame; } 

Il suo cpp:

 #include "State.h" #include "Frame.h" #include "LinkFrame.h" template  bool State::replace(Frame *f){ 

E … un’altra class.

La dichiarazione anticipata dovrebbe avere l’elenco completo degli argomenti del modello specificato.

c’è un’alternativa limitata che puoi usare

intestazione:

 class std_int_vector; class A{ std_int_vector* vector; public: A(); virtual ~A(); }; 

cpp:

 #include "header.h" #include  class std_int_vector: public std::vectror {} A::A() : vector(new std_int_vector()) {} [...] 

non testato in programmi reali, quindi aspettati che non sia perfetto.