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

VisualC++中同名内部类问题

  •  4
  • starblue  · 技术社区  · 16 年前

    问题发生在两个层上,每个层都有一个监听器接口作为内部类。B是a的侦听器,在其上面的第三层中有自己的侦听器(未显示)。

    class A
    {
    public:
        class Listener
        {
        public:
            Listener();
            virtual ~Listener() = 0;
        };
        // ...
    };
    

    B.h.公司

    class B : public A::Listener
    {
        class Listener
        {
        public:
            Listener();
            virtual ~Listener() = 0;
        };
        // ...
    };
    

    A::Listener()和A::~Listener()在A.cpp中定义。

    B::Listener::Listener() {}
    B::Listener::~Listener() {}
    

    我得到了错误

    B.cpp(49) : error C2509: '{ctor}' : member function not declared in 'B'
    

    ReSAS S2A的C++编译器对此没有问题,但它在某些方面比Visual C++更开放。

    如果我将侦听器接口重命名为具有不同的名称,问题就会消失,但我希望避免这种情况(真正的类名而不是A或B相当长)。

    是我正在做的正确的C++,还是通过Visual C++的投诉合理?

    1 回复  |  直到 16 年前
        1
  •  1
  •   codencandy    16 年前

    你发布的代码产生了与你在我的机器上描述的相同的编译器错误。我自己不太确定问题到底是什么,但我有一种感觉,从纯虚拟类继承并在后代中声明纯虚拟类可能不是一个好主意。

    class OuterA
    {
      public:
        class Listener
        {
          public:
            Listener() {}
            virtual ~Listener() = 0 {}
        };
    
        OuterA() {}
        ~OuterA(){}
    };
    
    class OuterB : public OuterA::Listener
    {
      public:
        class Listener
        {
          public:
            Listener()  {}
            ~Listener() {}
        };
    
        OuterB()  {}
        ~OuterB() {}
    };
    

    如果使用typedefs隐藏侦听器的名称,至少我的演示代码编译和链接是这样的:

    //收割台

    class OuterA
    {
      public:
        class Listener
        {
          public:
            Listener();
            virtual ~Listener() = 0;
        };
    
        OuterA();
        ~OuterA();
    };   
    
    class OuterB : public OuterA::Listener
    {
      public:
        class Listener
        {
          public:
            Listener();
            virtual ~Listener() = 0;
        };
    
        OuterB();
        ~OuterB();
    };
    

    OuterA::OuterA(){}
    OuterA::~OuterA(){}
    
    OuterA::Listener::Listener(){}
    OuterA::Listener::~Listener(){}
    
    typedef OuterB::Listener BListener;
    
    OuterB::OuterB() {}
    OuterB::~OuterB(){}
    
    BListener::Listener(){}
    BListener::~Listener(){}
    
    推荐文章