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

最佳答案

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

因此,CBase<ComponentX>尝试将模板作为参数传递给CBase,该参数需要一堆类型。

解决方法非常简单:

template<template<class...> class CBase>
struct ComponentX : public CBase<ComponentX<CBase>> // Specify the arguments
  {
  // This should compile now
  };
ComponentX<CBase>是您希望作为类型参数提供的专业名称。

09-05 00:33