在复杂的继承中C++模板

C++ templates in complicated inheritance

本文关键字:C++ 模板 继承 复杂      更新时间:2023-10-16

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

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

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:usersga1009documentsdevoasiscatbondsCatBond.h  213
Error   2   error C2923: 'QuantLib::GenericEngine' : 'Oasis::CatBond<TCoupon>::arguments' is not a valid template type argument for parameter 'ArgumentsType'   c:usersga1009documentsdevoasiscatbondsCatBond.h  213

我怎样才能让它工作?当CatBond是混凝土类型时,这种结构效果很好。

按照 Pubby 的提示,正确的实现是:

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

问题在于,像CatBond<TCoupon>::arguments这样的结构默认被C++编译器假定为变量而不是typename,因此,如果在我们的例子中,我们需要通过使用typename关键字明确声明这些是类型。