Как использовать с помощью CRTP?

При создании типов без дополнительных функций я стараюсь использовать usingвместо того, чтобы создавать подклассы или использовать typedef,

У меня есть иерархия CRTP, где я пытаюсь распространять конкретный тип вверх по дереву.

GrandKid похоже компилируется нормально. Есть ли способ получить GrandKid_2 работать?

СООБЩЕНИЕ ОБ ОШИБКЕ

junk.cpp:18:26: error: ‘GrandKid_2’ was not declared in this scope

КОД

template<typename T>
struct Parent
{
};

template<typename T>
struct Child
: public Parent<T>
{
};

struct GrandKid :
public Child<GrandKid>
{
};

// using GrandKid_2 = Child<GrandKid_2>;   // doesn't compile

int
main( int argv, char* argc[] )
{
GrandKid gk;  // ok
}

1

Решение

using, лайк typedefсоздает псевдоним, а не новый тип. Следовательно, вы не можете использовать GrandKid_2 для определения себя.

Вам обязательно нужно будет создать новый тип:

struct GrandKid_2 : Child<GrandKid_2> {};

Кстати, вы действительно хотите GrandKid_2 быть собственным ребенком? Может быть, вы имели в виду using GrandKid_2 = Child<GrandKid>

3

Другие решения

Других решений пока нет …