[C++/mingw] templates

Pagina: 1
Acties:

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
ik heb vandaag een template voor een linkedlist gemaakt. nu is het probleem dat de template wel onder G++ werkt maar niet onder mingw.

linkedlist.cc:19: non-template type `Node' used as a template
linkedlist.cc:19: ISO C++ forbids declaration of `previous' with no type

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class T> class LinkedList;

template <class T>
class LinkedList {
    class Node {
        Node<T> *previous;
        Node<T> *next;
        T *data;
    public:
        Node<T> (T *data, Node<T> *previous) {
            this->data = data;
            this->previous = previous;
        };


nu gebruik ik zelf geen mingw maar m'n maatje wel, hij zegt dus dat een tutorial met templates ook niet compiled onder mingw. hoe compile je die templates?

blijkt dus dat de templates van 2.95 niet overeenkomen met de templates van 3.1+ ... nu maar is kijken of dat te fixen is.

problem solved:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using namespace std;

template <class T> class LinkedList;

template <class T>
class LinkedList {
template <class _T>
    class Node {
        Node<_T> *previous;
        Node<_T> *next;
        _T *data;
    public:
        Node<_T> (_T *data, Node<_T> *previous) {
            this->data = data;
            this->previous = previous;
        };

[ Voor 36% gewijzigd door Skinkie op 13-12-2002 18:11 ]

Steun Elkaar, Kopieer Nederlands Waar!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

tip: gebruik [code=c++]...[/code] voor syntax highlighting

en weet je nu ook wat er fout is?

LinkedList<T>::Node is geen geparametrizeerde klasse, het is gewoon een klasse als elke andere normale klasse. Het toevoegen van die template speicifactie is dus nodig om om Node een geparametriseerde klasse te maken

Overiges nu het compiled, zit het toch niet helemaal lekker in elkaar. Een betere oplossing zou zijn is om de <T> uit het eerste stukje code gewoonweg weg te halen. Omdat LinkedList geparametriseerd is, is Node ook automatisch geparametriseerd aangezien het een klasse is die gedefinieerd is in LinkedList. LinkedList<int>::Node is dus ook wat anders dan LinkedList<float>::Node

En aangezien de LinkedList in dit geval het type mee moet krijgen en niet de Node, klopt die oplossing dus niet helemaal

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Een betere oplossing zou zijn is om de <T> uit het eerste stukje code gewoonweg weg te halen. Omdat LinkedList geparametriseerd is, is Node ook automatisch geparametriseerd aangezien het een klasse is die gedefinieerd is in LinkedList.
Ben ik nou gek of is dat precies zoals m'n eerste snipet er uitziet :? kun je is posten wat je bedoelt?

Steun Elkaar, Kopieer Nederlands Waar!


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
s/Node<_T>/Node/
s/_T/U/g

_T is een gereserveerde naam, voor compiler macro's e.d., en mingw zal andere compiler macro's hebben als G++.
Binnen een een class template gebruik je de template naam om de geinstantieerde class aan te duiden, dus de formele parameter hoef je niet te herhalen. De ctor is dus gewoon Node, niet Node<_T> of Node<U>, en hetzelfde geld voor alle Node parameters.

PS. std::list is waarschijnlijk wel zo handig.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

Skinkie schreef op 13 December 2002 @ 20:16:
[...]


Ben ik nou gek of is dat precies zoals m'n eerste snipet er uitziet :? kun je is posten wat je bedoelt?


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
class LinkedList
{
    class Node
    {
        Node *previous;
        Node *next;
        T *data;
    public:
        Node (T *data, Node *previous)
        {
            this->data = data;
            this->previous = previous;
        };
    };
    // ...
};

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.