8

編集:重複が見つかりました

以下を説明するために、いくつかの問題コードを最も単純な動作ケースに絞り込みました: 純粋な抽象基本クラスの typedef が派生クラスによって継承されていません。system_t以下のコードでは、 typedef をに継承したいと思いConcreteTemplateMethodます。

#include <iostream>

// pure abstract template-method
template <typename T>   // T == Analyzer<U>
class TemplateMethod {
  public:
    typedef T system_t;

    virtual void fn (const system_t& t) const = 0;
};


template <typename T>
class Analyzer {
  public:
    void TemplatedAlgorithm (const TemplateMethod< Analyzer <T> >& a) const {
      printf ("Analyzer::TemplatedAlgorithm\n");
      a.fn(*this);  // run the template-method
    }

    void fn () const {
      printf ("Analyzer::fn\n");
    }
};


// concrete template-method
template <typename T>
class ConcreteTemplateMethod : public TemplateMethod < Analyzer<T> > {
  public:
    typedef Analyzer<T> system_t;

    virtual void fn (const system_t& t) const {
      printf ("ConcreteTemplateMethod::fn\n");
      t.fn(); // perform Analyzer's fn
    }
};

int main () {

  Analyzer <double> a;
  ConcreteTemplateMethod<double> dtm;
  a.TemplatedAlgorithm(dtm);

  return 0;
}

このコードは、期待どおりにコンパイルおよび実行されます。以下は必須であり、ConcreteTemplateMethod削除するとコンパイラ エラーが発生します。

typedef Analyzer<T> system_t;

ただし、system_t型は基本クラスで既にtypedef'ed' になっていることに注意してください。継承時に別の typedef を含める必要があるのはなぜですか?

を使用system_tして派生の型名を修飾できることはわかっていますが、それは少し冗長であり、継承して同じ を使用する必要があるたびにベースに戻す必要がないようにしたいと考えています。base で定義できるこれを回避する方法はありますか?ConcreteTemplateMethodtypename TemplateMethod< Analyzer<T> >::system_t&typedefsystem_tTemplateMethod

4

1 に答える 1

8

やったほうがいい

typedef typename TemplateMethod<X>::system_t system_t;

typedef を「継承」します。typedef は自動的に継承されません (コンパイラが準拠している場合)。

スタックオーバーフローを見ると、この質問がどこかに重複しています。

于 2010-09-03T20:24:28.910 に答える