2012-02-05 50 views
1

需要通过继承实施纯抽象类,使用命名空间来包装我的所有类,以避免与他人发生冲突的帮助。错误消息:纯抽象类包裹在一个命名空间在C++

我已经能够建立并成功运行的代码,如果我从我的抽象类,并从我的纯抽象类继承所有课程中移除命名空间的包装。

这似乎是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*/ 
+0

这实际工作正常,我。你能发布错误吗? – 2012-02-05 09:59:29

+0

我在这里发布的代码有效,如果您在每个类的.h和.ccp文件中取消注释命名空间部分,那么它会抛出错误mgs,我的ConcreteClass是一种抽象方法。这似乎是编译器无法弄清楚,我已经实现了纯粹的抽象方法在我的具体类,除非我从使用IBASE类 – badboy11 2012-02-05 10:06:21

+3

随着命名空间没有注释的所有类中删除的命名空间,它[仍然有效(HTTP:/ /ideone.com/cpv7x)。你能发布导致错误的确切代码(和确切的错误信息)吗? – 2012-02-05 10:21:09

回答

0

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

书面,编译器相匹配ConcreteClass的向前声明的基础声明时,看到在全局命名空间:

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

当你声明Method001ConcreteClass

virtual bool Method001(const ConcreteClass &cc); 

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

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

namespace MyCustomNamespace { 
    class ConcreteClass; 
} 
+0

非常感谢您,只需将名称空间内的前向声明即可。今天拿起了一些新的东西,我认为所有的#包括和声明都假设在命名空间之外声明......生活和学习。 – badboy11 2012-02-06 16:51:49

+0

@ badboy11不用客气。如果你想要“在这里复制并粘贴这个文件,在这个命名空间中”,也可以在命名空间中“#include”。在类声明中看到'#include'更常见。 – justin 2012-02-06 20:21:02