我正在尝试使用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>
是您希望作为类型参数提供的专业名称。