Pointer to incomplete class type is not allowed

228,735

Solution 1

An "incomplete class" is one declared but not defined. E.g.

class Wielrenner;

as opposed to

class Wielrenner
{
    /* class members */
};

You need to #include "wielrenner.h" in dokter.ccp

Solution 2

One thing to check for...

If your class is defined as a typedef:

typedef struct myclass { };

Then you try to refer to it as struct myclass anywhere else, you'll get Incomplete Type errors left and right. It's sometimes a mistake to forget the class/struct was typedef'ed. If that's the case, remove "struct" from:

typedef struct mystruct {}...

struct mystruct *myvar = value;

Instead use...

mystruct *myvar = value;

Common mistake.

Solution 3

You get this error when declaring a forward reference inside the wrong namespace thus declaring a new type without defining it. For example:

namespace X
{
  namespace Y
  {
    class A;

    void func(A* a) { ... } // incomplete type here!
  }
}

...but, in class A was defined like this:

namespace X
{
  class A { ... };
}

Thus, A was defined as X::A, but I was using it as X::Y::A.

The fix obviously is to move the forward reference to its proper place like so:

namespace X
{
  class A;
  namespace Y
  {
    void func(X::A* a) { ... } // Now accurately referencing the class`enter code here`
  }
}

Solution 4

I came accross the same problem and solved it by checking my #includes. If you use QKeyEvent you have to make sure that you also include it.

I had a class like this and my error appeared when working with "event"in the .cpp file.

myfile.h

    #include <QKeyEvent> // adding this import solved the problem.

    class MyClass : public QWidget
    {
      Q_OBJECT

    public:
      MyClass(QWidget* parent = 0);
      virtual ~QmitkHelpOverlay();
    protected:
        virtual void  keyPressEvent(QKeyEvent* event);
    };
Share:
228,735
Sharpless512
Author by

Sharpless512

Updated on July 05, 2022

Comments

  • Sharpless512
    Sharpless512 almost 2 years

    For some reason I cannot use functions attached to the object I want to use. I added a comment to the line that is not working. As an error I get "Error; pointer to incomplete class type is not allowed" Please help

    This is code in dokter.ccp

    int counter = 0;        
    for (list<Wielrenner*>::iterator it = wielrenners.begin(); it != wielrenners.end(); it++){
        Wielrenner* wielrennerOB = *it;
        cout << "\nID: " << counter;
        cout << "List size: " << persons.size() << endl;
    
        wielrennerOB->print();  // This is not working
        counter++;
     }  
    

    This is code in wielrenner.h

    #ifndef WIELRENNER_H_
    
    #define WIELRENNER_H_
    
    //#include <fstream>
    
    #include "persoon.h"
    
    #include "Onderzoek.h"
    
    class Wielrenner :
    public Persoon
    {
    public:
        Wielrenner(string, string, Adres, string, Datum, Datum, string, int, float, float, float,list<Onderzoek>* );
        ~Wielrenner(void);
        int     getLengte() const;
        float   getGewicht() const;
        float   getVo2max() const;
        float   getMaxVermogen() const;
        list<Onderzoek> getOnderzoekenList();
    
        void    setLengte(int);
        void    setGewicht(float);
        void    setVo2max(float);
        void    setMaxVermogen(float);
        void    voegOnderzoekToeList(Onderzoek);
        void    showOnderzoeksList();
        void    setOnderzoeksLijst(list<Onderzoek>&);
        void    print();
        void    printFile(ofstream&);
    
    
    private:
    int     lengte;
    float   gewicht;
    float   vo2max;
    float   maxVermogen;
    list<Onderzoek> onderzoeken;
    };
    
    #endif /* WIELRENNER_H_ */
    

    code in wielrenner.CCP

    using namespace std;
    #include <string>
    
    #include "Wielrenner.h"
    /*
    #include "Onderzoek.h"
    
    */
    Wielrenner::Wielrenner(string voornaam, string achternaam, Adres adres, string telefoon, Datum datumInDienst, Datum geboorteDatum, 
                        string persoonType, int lengte, float gewicht, float vo2max, float maxVermogen,list<Onderzoek>* onderzoeken)
            : lengte(lengte), 
        gewicht(gewicht), 
        vo2max(vo2max), 
        maxVermogen(maxVermogen),
        Persoon(voornaam, achternaam, adres, telefoon, datumInDienst, geboorteDatum, persoonType)
    {
    }
    
    
    Wielrenner::~Wielrenner(void)
    {
    }
    
    //setten van gegevens
    void    Wielrenner::setLengte(int newLengte){
    lengte = newLengte;
    }
    void    Wielrenner::setGewicht(float newGewicht){
    gewicht = newGewicht;
    }
    void    Wielrenner::setVo2max(float newVo2max){
    vo2max = newVo2max;
    }
    void    Wielrenner::setMaxVermogen(float newMaxVermogen){
    maxVermogen = newMaxVermogen;
    }
    void    Wielrenner::voegOnderzoekToeList(Onderzoek newOnderzoek){
    onderzoeken.push_back(newOnderzoek);            
    }
    
    void    Wielrenner::showOnderzoeksList(){
    int teller=0;
    
    for (list<Onderzoek>::iterator it = onderzoeken.begin(); it != onderzoeken.end();     it++){
        Onderzoek onderzoekOB = *it;
        cout << teller << " - ";
        onderzoekOB.print();
        teller++;
     }  
    }
    
    void    Wielrenner::setOnderzoeksLijst(list<Onderzoek>& newOnderzoeksLijst){
    onderzoeken = newOnderzoeksLijst;
    }
    
    void    Wielrenner::print(){
    
    cout << "(" << persoonID << ") Persoon: " << endl;
    cout << persoonType << endl;
    cout << voornaam << " " << achternaam << endl;
    adres.print();
    cout << telefoon << endl;
    cout << "Datum in dienst: ";
    datumInDienst.print();
    cout << "Geboortedatum: ";
    geboorteDatum.print();
    cout << "> Extra wielrenner gegevens: " << endl;
    cout << "Lengte: " << lengte << endl;
    cout << "Gewicht: " << gewicht << endl;
    cout << "vo2max: " << vo2max << endl;
    cout << "maxVermogen: " << maxVermogen << endl;
    }
    void Wielrenner::printFile(ofstream &myfile){
    
    myfile <<  persoonID << "\n";
    myfile << persoonType << "\n";
    myfile << voornaam << " " << achternaam << "\n";
    adres.printFile(myfile);
    myfile << telefoon << "\n";
    datumInDienst.printFile(myfile);
    geboorteDatum.printFile(myfile);
    myfile << lengte << "\n";
    myfile << gewicht << "\n";
    myfile << vo2max << "\n";
    myfile << maxVermogen << "\n";
    }
    // returnen van gegevens
    
    int     Wielrenner::getLengte() const{
    return lengte;
    }
    float   Wielrenner::getGewicht() const{
    return gewicht;
    }
    float   Wielrenner::getVo2max() const{
    return vo2max;
    }   
    float   Wielrenner::getMaxVermogen() const{
    return maxVermogen;
    }
    list<Onderzoek> Wielrenner::getOnderzoekenList(){
    return onderzoeken;
    }
    
  • Sharpless512
    Sharpless512 over 11 years
    I have done this class Wielrenner; at the header file for the cpp (where the code is)
  • KRyan
    KRyan over 11 years
    @Sharpless512: dokter.ccp needs #include "wielrenner.h" in it, so that it knows the details of the class. It looks like dokter.h just has class Wielrenner; in it, hence the incomplete class error.
  • V-SHY
    V-SHY about 9 years
    thanks for giving me the idea to find out the header file declare the function that triggered the error and include the header file
  • Darkgaze
    Darkgaze about 6 years
    Note this also happens if you wrote the wrong name of the predeclaration and you imported that header file. Everything seems ok, but the predeclaration is not right :-)