#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
et utilisé cette fonction dans mon principal. J'ai des erreurs. Bien sûr, je sais qu'il y a plus de paramètres de modèle pour std::list
(allocator je pense). Mais ce n'est pas le sujet. Dois-je connaître la déclaration de modèle complète d'une classe de modèle pour pouvoir la transmettre?
EDIT: Je n'utilisais pas de pointeur avant - c'était une référence. Je vais l'essayer avec le pointeur.
std::allocator<T>
__TEST__
est un identifiant réservé, ne l'utilisez pas .Réponses:
Le problème n'est pas que vous ne pouvez pas déclarer en avant une classe de modèle. Oui, vous devez connaître tous les paramètres du modèle et leurs valeurs par défaut pour pouvoir le déclarer correctement:
Mais faire même une telle déclaration directe dans
namespace std
est explicitement interdit par la norme: la seule chose que vous êtes autorisé à insérerstd
est une spécialisation de modèle , généralementstd::less
sur un type défini par l'utilisateur. Quelqu'un d'autre peut citer le texte pertinent si nécessaire.Juste
#include <list>
et ne t'inquiète pas.Oh, d'ailleurs, tout nom contenant des doubles traits de soulignement est réservé à l'utilisation par l'implémentation, vous devriez donc utiliser quelque chose comme à la
TEST_H
place de__TEST__
. Cela ne va pas générer d'avertissement ou d'erreur, mais si votre programme a un conflit avec un identifiant défini par l'implémentation, il n'est pas garanti de se compiler ou de s'exécuter correctement: il est mal formé . Sont également interdits les noms commençant par un trait de soulignement suivi d'une majuscule, entre autres. En général, ne commencez pas les choses avec des traits de soulignement à moins que vous ne sachiez à quelle magie vous avez affaire.la source
namespace std
btw?#pragma once
plutôt que les # ifdef. Il est pris en charge par la plupart des compilateurs de nos jours.#pragma
, c'est pourquoi. Bien que ce soit une option.J'ai résolu ce problème.
J'étais en train d'implémenter une couche OSI (slider window, Level 2) pour une simulation de réseau en C ++ (Eclipse Juno). J'avais des cadres (modèle
<class T>
) et ses états (modèle d'état, déclaration avant).La solution est la suivante:
Dans le
*.cpp
fichier, vous devez inclure le fichier d'en-tête que vous transférez, c'est-à-direSon cpp:
Et ... une autre classe.
la source
using namespace
dans un fichier d'en-tête est une très mauvaise pratique car cela empêche quiconque utilisant ce fichier d'en-tête de pouvoir utiliser des noms locaux qui seraient autrement valides. Il bat fondamentalement le point entier des espaces de noms.La déclaration avant doit avoir une liste complète des arguments de modèle spécifiée.
la source
il existe une alternative limitée que vous pouvez utiliser
entête:
cpp:
pas testé dans de vrais programmes, alors attendez-vous à ce qu'il ne soit pas parfait.
la source