I'm getting the following errors when adding namespace to my project:
CPoolElement.h:
#ifndef CPOOLELEMENT_H_
#define CPOOLELEMENT_H_
namespace TestName {
class CPoolElement {
public:
CPoolElement();
virtual ~CPoolElement();
};
}
#endif /* CPOOLELEMENT_H_ */
CPoolElement.cpp:
#include "CPoolElement.h"
namespace TestName {
CPoolElement::CPoolElement() {
// TODO Auto-generated constructor stub
}
CPoolElement::~CPoolElement() {
// TODO Auto-generated destructor stub
}
}
CRecordingPoolElement.cpp:
#include "CRecordingPoolElement.h"
namespace TestName {
CRecordingPoolElement::CRecordingPoolElement() {
// TODO Auto-generated constructor stub
}
CRecordingPoolElement::~CRecordingPoolElement() {
// TODO Auto-generated destructor stub
}
}
CRecordingPoolElement.h:
#ifndef CRECORDINGPOOLELEMENT_H_
#define CRECORDINGPOOLELEMENT_H_
#include "CPoolElement.h"
namespace TestName {
class CRecordingPoolElement : public CPoolElement{
public:
CRecordingPoolElement();
virtual ~CRecordingPoolElement();
};
}
#endif /* CRECORDINGPOOLELEMENT_H_ */
CTwo.h:
#ifndef CTWO_H_
#define CTWO_H_
class CPoolElement;
namespace TestName {
class CTwo {
public:
CTwo();
virtual ~CTwo();
CPoolElement* GetElm();
};
}
#endif /* CTWO_H_ */
CTwo.cpp:
#include "CTwo.h"
#include "CRecordingPoolElement.h"
namespace TestName {
CTwo::CTwo() {
// TODO Auto-generated constructor stub
}
CTwo::~CTwo() {
// TODO Auto-generated destructor stub
}
CPoolElement* CTwo::GetElm() {
return new CRecordingPoolElement();
}
}
The error:
"error: prototype for TestName::CPoolElement* TestName::CTwo::GetElm()
does not match any in class TestName::CTwo
"
I cant understand what is the problem? The prototype is the same and there is no loop headers.
Moreover, If I'm removing the declaration of the namespace, I'm not getting errors.
You forward declared "class CPoolElement" outside the "TestName" namespace, but the CPoolElement found inside your definition of CTwo::GetElm is a class which is declared in the TestName namespace.
Namespaces allow you to separate your code from other class names which might be similarly named but declared in other headers, possibly coming a library or some external dependency. These are completely different classes and could do entirely different things.
When you forward declared CPoolElement in CTwo.h, you specified that the CPoolElement class you wanted should live (be declared) in the "global" namespace. However, when the compiler encountered your declaration of GetElm, it discovered a different class, "TestName::CTwo".
Move your forward declaration into the TestName namespace and I think you'll resolve your error.
CTwo.h:
#ifndef CTWO_H_
#define CTWO_H_
//class CPoolElement; <--- NOT HERE
namespace TestName {
class CPoolElement; // <--- HERE
class CTwo {
public:
CTwo();
virtual ~CTwo();
CPoolElement* GetElm();
};
}
#endif /* CTWO_H_ */