代码之家  ›  专栏  ›  技术社区  ›  user3668129

错误:XXX的原型与YYY类中的任何原型都不匹配

  •  1
  • user3668129  · 技术社区  · 9 年前

    在向项目中添加命名空间时,我遇到以下错误:

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

    C记录池元素.cpp:

    #include "CRecordingPoolElement.h"
    
    namespace TestName {
    
    CRecordingPoolElement::CRecordingPoolElement() {
        // TODO Auto-generated constructor stub
    
    }
    
    CRecordingPoolElement::~CRecordingPoolElement() {
        // TODO Auto-generated destructor stub
    }
    
    }
    

    C记录池元素.h:

    #ifndef CRECORDINGPOOLELEMENT_H_
    #define CRECORDINGPOOLELEMENT_H_
    
    #include "CPoolElement.h"
    
    namespace TestName {
    
    class CRecordingPoolElement : public CPoolElement{
    public:
        CRecordingPoolElement();
        virtual ~CRecordingPoolElement();
    };
    
    }
    #endif /* CRECORDINGPOOLELEMENT_H_ */
    

    C两小时:

    #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 回复  |  直到 9 年前
        1
  •  4
  •   MerickOWA    9 年前

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

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

    当您在CTwo中转发声明的CPoolElement时。h、 您指定了您想要的CPoolElement类应该位于(声明)“global”命名空间中。然而,当编译器遇到GetElm的声明时,它发现了一个不同的类“TestName::CTwo”。

    将前向声明移到TestName命名空间中,我认为您可以解决错误。

    C两小时:

    #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_ */
    
        2
  •  1
  •   Danke Xie    9 年前

    这确实有点令人费解。但我认为可以通过将“classCPoolElement”移动到“CTwo.h”中的名称空间TestName中来解决这个问题。

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

        3
  •  1
  •   Danny_ds    9 年前

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

    C两小时:

    namespace TestName {
    
    class CPoolElement;
    
    // ...
    }