Pointer to incomplete class type is not allowed

C++ListClassPointersIterator

C++ Problem Overview


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;
}

C++ Solutions


Solution 1 - C++

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 - C++

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 - C++

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 - C++

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);
    };

Solution 5 - C++

Check out if you are missing some import.

Solution 6 - C++

The problem also occurs when header files are not included explicitly where they are needed, but implicitly through other heading files.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSharpless512View Question on Stackoverflow
Solution 1 - C++KRyanView Answer on Stackoverflow
Solution 2 - C++Bryan WilcuttView Answer on Stackoverflow
Solution 3 - C++Jeff WeichersView Answer on Stackoverflow
Solution 4 - C++Matthis KohliView Answer on Stackoverflow
Solution 5 - C++zeroDividerView Answer on Stackoverflow
Solution 6 - C++Ahmed OmerView Answer on Stackoverflow