Доступ к внутреннему классу в CRTP (в C ++)

Следующий минимальный пример не компилируется.

template<class T>
class Base1 {};

template<class Impl>
class Base2 : public Base1<typename Impl::Inner> {}; // line 5

struct C : public Base2<C> // line 7
{
class Inner;
};

int main()
{
C c;
(void)c;
return 0;
}

Ошибка:

> g++ -std=c++11 -Wall incomplete.cpp -o incomplete
incomplete.cpp: In instantiation of ‘class Base2<C>’:
incomplete.cpp:7:19:   required from here
incomplete.cpp:5:7: error: invalid use of incomplete type ‘struct C’
incomplete.cpp:7:8: error: forward declaration of ‘struct C’

Теперь, однако, замена кода для Base2 на это работает:

template<class Impl>
class Base2
{
struct BaseInner : public Base1<typename Impl::Inner> {};
};

Почему (именно) ошибка не возникает сейчас? Можно ли избавиться от ошибки в первом примере кода?

Примечание. Следующий код, конечно, работает, но имеет тот недостаток, что мне нужно будет наследовать дважды каждый раз, когда я хочу создать класс, подобный C. Я хотел бы, чтобы было решение, в котором все было сделано до того, как дать Base2 шаблон.

template<class Impl>
class Base2
{
struct BaseInner : public Base1<typename Impl::Inner> {};
};

struct _C : public Base2<_C> // line 7
{
class Inner {};
};

struct C : public _C, _C::Inner
{
};

1

Решение

Задача ещё не решена.

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

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

По вопросам рекламы [email protected]