4

Visual C++ 2005 で問題が発生しました。明らかに同じ名前の内部クラスが別の外部クラスにあると混乱します。

この問題は、各レイヤーが内部クラスとしてリスナー インターフェイスを持つ 2 つのレイヤーで発生します。B は A のリスナーであり、その上の 3 番目のレイヤーに独自のリスナーがあります (表示されていません)。

コードの構造は次のようになります。

ああ

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

Bh

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

A::Listener() と A::~Listener() は A.cpp で定義されています。

B.cpp

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

エラーが発生します

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

Renesas sh2a 用の C++ コンパイラはこれに問題はありませんが、他の点でも Visual C++ よりもリベラルです。

リスナー インターフェイスの名前を変更して別の名前にすると、問題は解決しますが、それは避けたいと思います (A または B ではなく、実際のクラス名はかなり長いです)。

私がやっていることは正しい C++ ですか、それとも Visual C++ による苦情は正当化されますか?

リスナー インターフェイスの名前を変更せずにこの問題を回避する方法はありますか?

4

1 に答える 1

1

あなたが投稿したコードは、私のマシンで説明したのと同じコンパイラエラーを生成しました。問題が正確に何であるかはよくわかりませんが、純粋な仮想クラスから継承し、子孫内で純粋な仮想クラスを宣言するのは良い考えではないかもしれないと感じています。

私はなんとか修正されたバージョンをコンパイルすることができました、多分これはあなたがあなたの問題を解決するのを助けるでしょう:

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() {}
};

//インラインctorおよびdtorを回避するために編集

typedefを使用してリスナーの名前を非表示にすると、少なくとも私のデモコードがコンパイルされてリンクされます。

//ヘッダー

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(){}
于 2010-05-07T12:31:57.793 に答える