错误:“XXX”的原型与“YYY”中的任何一个都不匹配

时间:2016-01-19 16:20:43

标签: c++ namespaces function-prototypes

向项目添加名称空间时出现以下错误:

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()的原型与班级TestName::CTwo中的任何内容都不匹配”

  • 我不明白这是什么问题?原型是相同的,没有循环标题。

  • 此外,如果我删除命名空间的声明,我不会收到错误。

    1. 那么在使用命名空间时如何修复此错误?
    2. 为什么使用命名空间向我的代码添加错误?

3 个答案:

答案 0 :(得分:4)

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

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

在CTwo.h中转发声明的CPoolElement时,指定了您想要的CPoolElement类应该在“global”命名空间中生存(声明)。但是,当编译器遇到你的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_ */

答案 1 :(得分:1)

这确实有点令人费解。但我认为您可以通过将“类CPoolElement”移动到“CTwo.h”中的命名空间TestName来修复它。

这是因为你在CPoolElement.h中定义了TestName :: CPoolElement,但是在CTwo.h中,你引用了:: CPoolElement。确实存在不匹配。

答案 2 :(得分:1)

class CPoolElement必须在命名空间内移动:

CTwo.h:

namespace TestName {

class CPoolElement;

// ...
}