質問

編集:見つかりました 複製

次のことを説明するために、最も単純な作業ケースにいくつかの問題コードを削りました。純粋な抽象的なベースクラスの私の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しかし、基本クラスでエド。継承するときに別のtypedefを含める必要があるのはなぜですか?

私はのタイプ名を資格を得ることができることを理解しています system_t 派生した ConcreteTemplateMethod 使用して typename TemplateMethod< Analyzer<T> >::system_t&, 、しかし、それは少し冗長です、そして私は再び避けなければならないことを望んでいますtypedef 私が相続するたびにベースに、それを同じ使用する必要があります system_t. 。私がベースで定義できるこれを回避する方法はありますか TemplateMethod?

役に立ちましたか?

解決

やったほうがいい

typedef typename TemplateMethod<X>::system_t system_t;

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top