我正在尝试使用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情况下模板模板参数是否存在某些限制?
答案 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}}
是您希望作为类型参数提供的专业化名称。