在复杂的继承中C++模板
C++ templates in complicated inheritance
可能的重复项:
我必须在哪里以及为什么必须放置"模板"和"类型名称"关键字?
我有一个定义如下的模板类型:
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
关键字明确声明这些是类型。
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数