gpt4 book ai didi

c++ - 错误消息 : Pure Abstract Class wrapped in a Namespace in C++

转载 作者:太空宇宙 更新时间:2023-11-04 14:18:54 25 4
gpt4 key购买 nike

通过继承实现纯抽象类方面需要帮助,使用命名空间包装我的所有类以避免与其他类发生冲突。

如果我从我的抽象类和所有继承 self 的纯抽象类的类中删除 namespace 包装器,我就能够成功地构建和运行代码。

似乎 Visual Studio 2010 编译器提示尽管所有类都在同一个命名空间中,但抽象类的纯抽象方法没有实现。

如有任何帮助,我们将不胜感激。

//IBaseClass.h

//forward declaration
class ConcreteClass;

//namespace MyCustomNamespace
//{
class IBaseClass
{
public:
virtual ~IBaseClass() { /*virtual destructor*/ }
//Behaviours...
virtual bool Method001( const ConcreteClass &cc ) = 0;
//virtual bool Method002(/*some input*/) = 0;
};
//} /*NAMESPACE*/

//-----------------------------------------
//ParentClass.h

//namespace MyCustomNamespace
//{
class ParentClass : virtual public IBaseClass
{
private:
int a;

public:
virtual ~ParentClass() { /*virtual destructor*/ }

//getter-setter implemented in ParentClass.cpp file...
void setA(const int aa);
const int getA() const;
};
//} /*NAMESPACE*/


//-----------------------------------------
//ConcreteClass.h

//namespace MyCustomNamespace
//{
class ConcreteClass: public ParentClass
{
private:
int b;

public:
virtual ~ConcreteClass() { /*virtual destructor*/ }

//getter-setter...
void setB(const int bb);
const int getB() const;

bool Method001( const ConcreteClass &cc ); //re-declaring IBase abstract method...
};
//} /*NAMESPACE*/


//-----------------------------------------
//ConcreteClass.cpp


//namespace MyCustomNamespace
//{
void ConcreteClass::setB(const int bb) { this->b = bb; }
const int ConcreteClass::getB() const { return this->b; }

bool ConcreteClass::Method001( const ConcreteClass &cc )
{
//implementation code goes here...
return false;
}
//} /*NAMESPACE*/

最佳答案

问题是您的转发类已在另一个 namespace (特别是全局 namespace )中声明。因此,要覆盖的虚拟是具有不同参数类型的不同符号。

如所写,编译器将 ConcreteClass 匹配到它在基类中声明时在全局命名空间中看到的前向声明:

virtual bool Method001( const ConcreteClass &cc ) = 0;

当您在 ConcreteClass 中声明 Method001 时:

virtual bool Method001( const ConcreteClass &cc );

编译器将 ccMyCustomNamespace::ConcreteClass 匹配,因为这是更准确的匹配。

要解决这个问题,只需将您的前向声明放在正确的命名空间中:

namespace MyCustomNamespace {
class ConcreteClass;
}

关于c++ - 错误消息 : Pure Abstract Class wrapped in a Namespace in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9148315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com