Является ли этот синтаксис законным в c ? и как мне использовать трюк crtp?

#c #crtp

Вопрос:

 template<template<typename>class Derived>
class Base{
    public:
        void interface(){
             static_cast<Derivedamp;>(*this).something();
        }
};

template<typename T>
class Derived:public Base<Derived> {
    ...
};
 

Производному требуется один параметр шаблона, но я использую только безымянный параметр для класса, полученного в базе.
Могу ли я использовать этот синтаксис?
Что я исправляю?
Как я могу получить доступ к производным в базе?


могу ли я добавить, используя dType = производное имя типа::введите в базу? в gcc версии 10.2 я получил такие ошибки;

 test.cpp: In instantiation of 'class Base<Derived<int> >':
test.cpp:22:7:   required from 'class Derived<int>'
test.cpp:30:24:   required from here
test.cpp:13:9: error: invalid use of incomplete type 'class Derived<int>'
   13 |   using dType = typename derived::Type;
      |         ^~~~~
test.cpp:22:7: note: declaration of 'class Derived<int>'
   22 | class Derived:public Base<Derived<T>>{
 

Я просто добавляю, используя dType = Производный::Введите свой код.

Комментарии:

1. Base Действительно ли должен быть «шаблон шаблона»?

2. Нет, я просто хочу знать, законно ли это и полезно ли

Ответ №1:

Вы можете просто явно указать имя параметра шаблона внутри Derived :

 template<typename Derived>
class Base{
    public:
        void interface(){
             typename Derived::type some_variable;
             static_cast<Derivedamp;>(*this).something();
        }
};

template<typename T>
class Derived:public Base<Derived<T>> {
public
    using type = T;
    ...
};