CRTP和template模板参数限制

CRTP and template template parameters limitation

我正在尝试使用 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的情况下模板模板参数是否有一些限制吗?

一个class模板名称代表"current specialization"(即它是一个注入的class名称)仅在class的{开头之后模板定义,在其范围内。在此之前,它是一个模板名称。

所以 CBase<ComponentX> 是尝试将模板作为参数传递给 CBase,它需要一组类型。

修复相当简单:

template<template<class...> class CBase>
struct ComponentX : public CBase<ComponentX<CBase>> // Specify the arguments
  {
  // This should compile now
  }; 

ComponentX<CBase> 是您希望作为类型参数提供的专业名称。