【问题标题】:inheritance from class,defined in th different namespace从类继承,在不同的命名空间中定义
【发布时间】:2012-04-29 11:48:59
【问题描述】:

我有 2 个类,在不同的命名空间中定义:

//--==file1.hpp==--
namespace n1{
class x1 {
//.....
};
};
//--==file2.hpp==--
namespace n2{
class x1: public n1::x1{
//.....
    };
};

//--== file3.hpp ==--
namespace n2 {
 class x2 {
    private:
      n1::x1* data1_;
    public:
      void func(x1* data2) { data1_ = data2; }
  };
};

这个编译失败了

error C2440: '=' : cannot convert from `'n2::x1 *' to 'n1::x1 *'`

我无法理解可能是什么问题,因为 n2:x1 继承自 n1::x1...? 谢谢

【问题讨论】:

  • 您能否通过将两个类放在同一个命名空间中查看问题是否消失来检查(如您的问题所暗示的)命名空间是否是问题的一部分?
  • //--== file3.hpp ==-- namespace2?? namespce n2 你的意思是?
  • @Lol4t0 - 谢谢 - 我修正了错字
  • @BlueMonkMN - 很难做到 - 许多额外的课程都基于它
  • 好的,但是它可以正常工作:ideone.com/DYQV8。你使用前向类型声明吗?

标签: c++ inheritance pointers namespaces


【解决方案1】:

从一个命名空间继承到另一个命名空间类,不应该有任何编译错误。只是,在子类中,如果必须调用父类的方法(在另一个命名空间中),则应使用全名(带namespace)。

供您参考:

namespace a
{
class A1 {
 public:
    void testA1() {...}
};
}

namespace b
{
class B1: public class a::A1
{
 public:
    void testB1()
        {
          a::A1::testA1();
          ...
        }
};
}

但是看起来,上面的问题只是一个错字问题,并且已经解决了。但是,为了澄清用法,示例代码会有所帮助。

【讨论】:

    【解决方案2】:

    在file2.h中:包含file1.h

    在file3.h中:包括file1.h和file2.h。

    并且主要包括 file3.h。

    int main() {

    n2::x2 xx22;
    n2::x1* xx11;
    xx22.func(xx11);
    

    }

    这符合要求。

    【讨论】:

    • 这与问题无关。如果他没有做包含,编译器会产生一大堆错误,不包括他列出的那个。
    • 我没有说他没有包含任何东西。但是,这包括订单对我有用。请用上面的代码试试。
    猜你喜欢
    • 2017-12-21
    • 2017-12-10
    • 2011-01-15
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多