2009-08-23 8 views
4

Donc, fondamentalement, la tâche consistait à créer une liste doublement chaînée qui est gérée de manière générique plutôt que verrouillée sur un seul type de données. J'ai essayé de compiler à la fois avec gcc et msvc et les deux compilateurs me donnent à peu près les mêmes erreurs, donc je suppose que c'est juste mon mauvais codage et non l'excentricité d'un compilateur ou de l'autre.Problèmes étranges de création de modèles C++

Actuellement, je suis en train de dire que les erreurs mes classes dans linkList.h ne sont pas un modèle

../linkList.h:34: error: ‘llist’ is not a template type
../linkList.h:143: error: ‘iter’ is not a template type
../josephus.cpp:14: error: ‘llist’ is not a template
../josephus.cpp:14: error: aggregate ‘llist ppl’ has incomplete type and cannot be defined
../josephus.cpp:15: error: ‘iter’ is not a template

linkList.h


template<typename T> 
class iter 
{ 
public: 
iter() 
{ 
    position = sentin; 
    container = sentin->payload; 
} 

T get() const 
{ 
    assert(position != sentin); 
    return position->payload; 
} 

void next() 
{ 
    position = position->next; 
} 

void previous() 
{ 
    position = position->prev; 
} 

bool equals(iter itr) const 
{ 
    return position == itr.position; 
} 
private: 
node *position; 
llist *container; 
}; 

josephus.cpp


llist<int> ppl; 
iter<int> pos; 

int start = static_cast<int>(argv[1]) - 1; 
int end = static_cast<int>(argv[2]) - 1; 

Toute aide à ce sujet est très apprécié

+0

En matière de style, il n'y a rien de mal à demander de l'aide pour les devoirs, mais ne dites pas "je ne sais pas". Je comprends! " et vider tout votre code sur d'autres personnes. Essayez de publier le code le moins possible pour reproduire votre problème. –

+0

Édité pour plus de clarté, désolé à ce sujet – user161741

+0

C'est cool - tout le monde fait des erreurs. –

Répondre

11

Votre déclaration anticipée dit llist est une classe:

class llist; 

Ensuite, vous dites qu'il est un modèle:

template<typename T> 
class llist; 

De même avec iter.

Je ne sais pas comment vous pouvez le rendre facilement compilable. Cependant, vous pouvez faire node et iter 'à l'intérieur' de llist.

+0

Ah merde, eh bien ça fait du sens maintenant que je vois la réponse. Je ne peux pas croire que j'ai fait une erreur comme ça, merci. – user161741

+0

par "à l'intérieur", je crois qu'il veut dire privé à la classe de la liste. C'est comme ça que je le ferais. – jkeys

+0

Voici un lien vers une question très similaire ailleurs sur SO. J'ai trouvé cette question (et votre bonne réponse) lors de la recherche de l'autre. http://stackoverflow.com/questions/1590688/class-is-not-a-template-type – razlebe

2

La liste n'est pas une classe. Donc en avant déclarant que ce n'est pas utile.

template<typename T> class llist; 

Essayer de compiler le code est relativement simple.
Vous venez de manquer la partie modèle d'un grand nombre de types. Recherche pour Ier liste et noeud et assurez-vous qu'ils ont le bon à la fin.

Si vous regardez le STL, il est conventinal de typedef certains types internes pour la facilité d'utilisation. Vous pourriez suivre le même principe.

template<typename T> 
class llist 
{ 
    typedef iter<T> Iter; 
    typedef node<T> Node; 

     // The rest of the code. 
}; 
2

Il existe plusieurs problèmes.

class A; 

n'est pas la manière dont vous transférez une classe modélisée.

Si A a un seul paramètre basé sur un modèle que vous devez dire:

template<typename T> 
class A; 

Si vous dites que lorsque vous avez déjà dit class A; vous vous contredisez. Le prochain numéro est simlar, friend class A; si A est basé sur un modèle ne fonctionne pas, vous devez dire friend class A<T>; ou similaire. Enfin, static_cast<int>(argv[1]) ne compilera pas (bien que static_cast<int>(argv[1][0]) serait, mais ne veut toujours pas que vous voulez).Pour convertir une chaîne en entier de manière significative, vous devez utiliser atoi, strtol, stringstream etc.

+0

Merci pour cela dirige sur atoi, qui était l'une des erreurs que je me préparais à travailler sur – user161741

Questions connexes