将命名空间添加到项目时出现以下错误:

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

}

错误:
“错误:TestName::CPoolElement* TestName::CTwo::GetElm()的原型(prototype)与TestName::CTwo类中的任何不匹配”
  • 我不明白是什么问题?原型(prototype)是相同的,并且没有循环头。
  • 此外,如果要删除 namespace 的声明,则不会出错。
  • 那么如何在使用命名空间时解决此错误?
  • 为什么使用命名空间向我的代码添加错误?
  • 最佳答案

    您将声明的“类CPoolElement”转发到“TestName”命名空间之外,但是在CTwo::GetElm定义中找到的CPoolElement是在TestName namespace 中声明的类。

    命名空间使您可以将代码与其他类名分开,这些类名可以类似地命名,但可以在其他 header 中声明,可能来自库或某些外部依赖项。这些是完全不同的类,可以做完全不同的事情。

    当在CTwo.h中转发声明的CPoolElement时,您指定了想要的CPoolElement类应该存在(声明)在“全局”命名空间中。但是,当编译器遇到您对GetElm的声明时,它发现了另一个类“TestName::CTwo”。

    将您的向前声明移到TestName命名空间中,我想您会解决您的错误。

    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_ */
    

    09-07 05:58