CRTP和模板模板参数限制

时间:2018-09-20 08:54:45

标签: c++ templates template-meta-programming crtp

我正在尝试使用CRTP,但是对于为什么以下代码无法编译感到困惑。

template<template<class...> class CBase>
struct ComponentX : public CBase<ComponentX>
  {
  // This does NOT compile
  };

template<template<class...> class CBase>
struct ComponentY : public CBase<int>
  {
  // This does compile
  };

您知道在CRTP情况下模板模板参数是否存在某些限制?

1 个答案:

答案 0 :(得分:8)

仅在类模板定义的范围内打开{后,类模板名称代表“当前专业化名称”(即,它是注入的类名称)。在此之前,它是一个模板名称。

因此,CBase<ComponentX>是一种尝试将模板作为参数传递给CBase的尝试,template<template<class...> class CBase> struct ComponentX : public CBase<ComponentX<CBase>> // Specify the arguments { // This should compile now }; 需要一堆类型。

修复非常简单:

ComponentX<CBase>

Schema Module-order DEFINITIONS AUTOMATIC TAGS ::= BEGIN Order ::= SEQUENCE { header Order-header } Order-header ::= SEQUENCE { reference NumericString (SIZE (12)), date NumericString (SIZE (8)) -- MMDDYYYY -- }END Parser Output >>> foo = asn1tools.parse_files('we.asn') >>> foo {'Module-order': {'extensibility-implied': False, 'tags': 'AUTOMATIC', 'imports': {}, 'object-sets': {}, 'values': {}, 'object-classes': {}, 'types': {'Order': {'type': 'SEQUENCE', 'members': [{'type': 'Order-header', 'name': 'header'}]}, 'Order-header': {'type': 'SEQUENCE', 'members': [{'type': 'NumericString', 'name': 'reference', 'size': [12]}, {'type': 'NumericString', 'name': 'date', 'size': [8]}]}}}} {header:{reference:NumericString (SIZE (12)),date NumericString (SIZE (8)) -- MMDDYYYY --}} Desired Output {'header':{'reference': NumericString,'date':NumericString}} 是您希望作为类型参数提供的专业化名称。