0

HP C/aC++ コンパイラ バージョン A.03.85 を使用して、HP-UX 11.11 でこの正当な C++ コードをビルドしようとしています。

class BaseClass
{
public:

  virtual int sum(int i) = 0;
};

class Derived : public BaseClass
{
public:

  using BaseClass::sum;
  virtual int sum(int i1, int i2) = 0;
};

class Impl : public Derived
{
public:
  virtual int sum(int i) { return i+1; }
  virtual int sum(int i1, int i2) { return i1+i2; }
};

int main()
{
  Derived * obj = new Impl;
  obj->sum(5);
  delete obj;
}

ただし、次のコンパイル エラーで失敗します。

Error 181: "test_using.cpp", line 26 # Expected 2 argument(s) for "int Derived::sum(int,int)"; had 1 instead.
      obj->sum(5);
      ^^^^^^^^^^^

これとまったく同じコードを、Linux、AIX、Windows などの他のプラットフォームで問題なくビルドできます。「BaseClass」から「= 0」スニペットを削除すると、すべてが期待どおりに機能するため、HP の問題は純粋な仮想メソッドに関連しているようです。

だから、私の質問は次のとおりです。以前に同様の問題に直面したことがありますか? どのように回避しましたか?これは既知の C++ バグですか?

純粋な仮想メソッドを通常のメソッドに変えることはできないことに注意してください。

4

1 に答える 1

0
class Derived : public BaseClass
{
public:
    virtual int sum(int i) = 0;
    virtual int sum(int i1, int i2) = 0;
};

または、変更を行った理由とコードをより適切に文書化したい場合は、次のようにします。

class Derived : public BaseClass
{
public:

# ifdef USING_HP_BUGWARE
    virtual int sum(int i) = 0;
# else
    using BaseClass::sum;
# endif

    virtual int sum(int i1, int i2) = 0;
};
于 2012-03-15T01:01:01.123 に答える