0

重複の可能性:
「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

次のように定義されたテンプレートタイプがあります。

template<class TCoupon>
class CatBond : public Instrument {
public:
    class arguments;
class engine;

    //actual content
}

そして、私はこれをしたい:

template<class TCoupon>
    class CatBond<TCoupon>::engine :
        public GenericEngine<CatBond<TCoupon>::arguments,
                             CatBond<TCoupon>::results> {};

ここで、GenericEngineはQuantLibライブラリで定義されており、次のように操作しようとしています。

template<class ArgumentsType, class ResultsType>
class GenericEngine : public PricingEngine,
                      public Observer {
  public:
    PricingEngine::arguments* getArguments() const { return &arguments_; }
    const PricingEngine::results* getResults() const { return &results_; }
    void reset() { results_.reset(); }
    void update() { notifyObservers(); }
  protected:
    mutable ArgumentsType arguments_;
    mutable ResultsType results_;
};

ただし、これはコンパイルされません。

Warning 1   warning C4346: 'Oasis::CatBond<TCoupon>::arguments' : dependent name is not a type  c:\users\ga1009\documents\dev\oasis\catbonds\CatBond.h  213
Error   2   error C2923: 'QuantLib::GenericEngine' : 'Oasis::CatBond<TCoupon>::arguments' is not a valid template type argument for parameter 'ArgumentsType'   c:\users\ga1009\documents\dev\oasis\catbonds\CatBond.h  213

どうすればそれを機能させることができますか?この構成は、CatBondが具象型の場合にうまく機能しました。

4

1 に答える 1

1

Pubby のヒントに従って、正しい実装は次のとおりです。

template<class TCoupon>
    class CatBond<TCoupon>::engine :
        public GenericEngine<typename CatBond<TCoupon>::arguments,
                             typename CatBond<TCoupon>::results> {};

問題はCatBond<TCoupon>::arguments、C++ コンパイラによる型名ではなく、デフォルトで like の構造が変数であると想定されているため、この場合、typenameキーワードを使用してこれらが型であることを明示的に述べる必要がある場合です。

于 2013-02-01T10:31:46.030 に答える