Использование члена производного типа в классе CRTP

У меня есть любопытно повторяющийся класс шаблона шаблона и производный класс, например, так:

template<class Derived>
class A {
typedef typename Derived::C D;
D x;
};
class B : public A<B> {
public:
class C { };
};

Это не скомпилируется из-за того, что B не полностью определен, когда компилятор пытается определить D. Как я могу достичь аналогичного результата, то есть иметь члены A, имеющие тип, определенный в B? Или я должен заставить C быть определенным вне B?

5

Решение

Или я должен заставить C быть определенным вне B?

Да, к сожалению, вы должны это сделать. Обычно вы можете определить класс шаблона до A и специализировать его для B, содержащий C тип. Это позволяет использовать его в A,

template<typename T>
struct members;

template<class Derived>
class A {
typedef typename members<Derived>::C D;
D x;
};

template<>
struct members<class B> {
class C { };
};
class B : public A<B> {
public:
};
8

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector