0

可能重复:
我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

我有一个模板类型定义如下:

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默认情况下,like 的构造被 C++ 编译器假定为变量而不是类型名,所以如果在我们的例子中,我们需要使用typename关键字明确声明这些是类型。

于 2013-02-01T10:31:46.030 回答