Ограничение параметров шаблона CRTP и шаблона - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь поэкспериментировать с 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 голосов
/ 20 сентября 2018

Имя шаблона класса означает «текущая специализация» (т. Е. Это имя внедренного класса) только после открытия { определения шаблона класса внутри его области действия.До этого это имя шаблона.

Итак, CBase<ComponentX> - это попытка передать шаблон в качестве аргумента CBase, который ожидает пакет типов.

Исправление довольнопросто:

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

ComponentX<CBase> - это название специализации, которую вы хотите указать в качестве аргумента типа.

...