Toon posts:

[C++] Request for member which is of non-aggregate type?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben op het gebied van C++ redelijk nieuw, heb tot nu toe alleen Java gedaan. Ik ben nu C++ aan het leren, en ik dacht van: ik ga eens een LinkedList schrijven. Ik heb de volgende header-file:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
 
template <class T>
class LinkedList
    {
    // Nested class Node
    class Node
        {
        private:
            T m_object;
            Node* m_nextNode;
        public:
            // Constructors
            Node ();
            Node (T object);
            Node (T object, Node* nextNode);
            // Destructor
            ~Node ();
                
            // Member access functions
            T& get ();
            Node* getNext ();
            void setNext (Node* nextNode);
        };
    
    private:
        Node m_firstNode;
    public:
        // Constructors
        LinkedList ();
        LinkedList (T object);
        LinkedList (const LinkedList& list);
    
        // Access functions
        T& get (int index);
        void remove (int index);
        void add (T object);
        void addAtIndex (T object, int index);
        int length ();
    };
    
#endif

Deze heb ik natuurlijk geimplementeerd in een .cpp-file, dat compileert ook allemaal. Maar als ik m'n main.cpp probeer te compileren, zegt ie "main.cpp:6: request for member `add' in `list()', which is of non-aggregate type `LinkedList<int> ()()'". Wat betekent dit, en wat doe ik fout?
Dit is m'n main.cpp:

C++:
1
2
3
4
5
6
7
8
9
10
#include <iostream.h>
#include "LinkedList.h"

int main () {
    LinkedList<int> list ();
    list.add (5);
    list.add (3);
    cout << list.length () << endl;
    return 0;
    }

[ Voor 14% gewijzigd door Verwijderd op 16-09-2003 14:56 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

C++:
1
LinkedList<int> list ();

dat is een functiedeclaratie, geen variabele definitie. Laat de haakjes gewoon weg

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


Overigens,
C++:
1
2
3
LinkedList (T object);
// ...
void add (T object);


het is beter om daar const T & van te maken, zodat er geen onnodige kopies worden gemaakt als je besluit om bijvoorbeeld gebruik te maken van een LinkedList<MyVeryBigClass>

Ik zie trouwens dat je de implementaties van de functies niet in de header file plaatst. Dat moet wel, omdat de compiler pas code kan genereren als ie weet wat voor typen er gebruikt worden. En als je alleen een source file hebt waar de definities in staan, dan weet ie nog niet wat voor types er gebruikt gaan worden, en wordt er dus ook nog geen code gegenereerd.

(of je moet van export gebruik maken, maar er zijn niet veel compilers die dat ondersteunen)

[ Voor 96% gewijzigd door .oisyn op 16-09-2003 15:02 ]

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.