2009-08-23 8 views
4

Also im Grunde die Zuordnung mussten wir eine doppelt verkettete Liste erstellen, die generisch anstelle von auf einen einzelnen Datentyp gesperrt ist. Ich habe versucht, sowohl mit gcc und msvc zu kompilieren und beide Compiler geben mir ungefähr die gleichen Fehler, so nehme ich an, dass es nur meine schlechte Codierung und nicht die Eigensinnigkeit des einen oder anderen Compilers ist.Weird C++ Templating Probleme

Derzeit erhalte ich Fehler zu sagen, dass meine Klassen in linkList.h sind keine Vorlage

../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; 

in dieser Angelegenheit Jede Hilfe ist sehr

geschätzt
+0

Als Stilsache ist nichts falsch daran, nach Hausaufgabenhilfe zu fragen, aber bitte sagen Sie nicht "I don ' t hol es! " und deinen Code auf andere Leute übertragen. Versuchen Sie, so wenig Code wie möglich zu veröffentlichen, um Ihr Problem zu reproduzieren. –

+0

Editiert für Klarheit, sorry darüber – user161741

+0

Es ist cool - jeder macht Fehler. –

Antwort

11

Ihre Forward-Deklaration sagt llist eine Klasse:

class llist; 

Dann sagen Sie es eine Vorlage:

template<typename T> 
class llist; 

Ähnlich mit iter.

Ich weiß nicht, wie Sie es leicht kompilierbar machen können. Sie können jedoch node und iter "innen" von llist machen.

+0

Ah Mist, das macht jetzt Sinn, wenn ich die Antwort sehe. Ich kann nicht glauben, dass ich einen Fehler gemacht habe, danke. – user161741

+0

von "inside", ich glaube, er meint privat in der llist-klasse. So würde ich es machen. – jkeys

+0

Hier ist ein Link zu einer sehr ähnlichen Frage an anderer Stelle auf SO. Ich habe diese Frage (und deine richtige Antwort) bei der Recherche des anderen gefunden. http://stackoverflow.com/questions/1590688/class-is-not-a-template-type – razlebe

2

Die llist ist keine Klasse. Also vorwärts erklären, es ist nicht sinnvoll.

template<typename T> class llist; 

Der Versuch, den Code kompilieren zu lassen, ist relativ einfach.
Sie haben gerade den Template-Teil vieler Typen verpasst. Suchen Sie nach iter llist und node und stellen Sie sicher, dass sie am Ende das Passende haben.

Wenn Sie die STL betrachten, ist es üblich, einige interne Typen für die Benutzerfreundlichkeit zu schreiben. Sie könnten dem gleichen Prinzip folgen.

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

     // The rest of the code. 
}; 
2

Es gibt mehrere Probleme.

class A; 

ist nicht die Art, wie Sie eine Vorlagenklasse deklarieren.

Wenn A hat einen einzigen Parameter Templat Sie sagen müssen:

template<typename T> 
class A; 

Wenn Sie sagen, dass, nachdem Sie bereits gesagt haben class A; Sie selbst sind zu widersprechen. Die nächste Ausgabe ist simlar, friend class A; Wenn A wird nicht funktioniert, müssen Sie sagen, friend class A<T>; oder ähnliches. Schließlich wird static_cast<int>(argv[1]) nicht kompilieren (obwohl static_cast<int>(argv[1][0]) würde, aber immer noch wollen Sie nicht wollen).Um eine Zeichenfolge sinnvoll in eine ganze Zahl zu konvertieren, müssen Sie atoi, strtol, stringstream usw. verwenden.

+0

Danke dafür, dass du auf atoi gehst, das war einer der Fehler, an denen ich gerade arbeitete – user161741