Ошибка «разработанный тип относится к typedef» при попытке подружиться с typedef

Допустим, у меня есть следующий фрагмент кода (простая иерархия классов CRTP). Я хочу определить тип базового класса, чтобы сохранить типизацию (в моем коде я использую тип базового класса более одного раза, а базовый класс принимает несколько параметров шаблона), и мне нужно подружиться с базовым классом, так как я хочу сохранить реализация частная.

template< class D >
class Base
{

public:

    void foo() { *static_cast< D * >(this)->foo_i(); }

};

template< class T >
class Derived : public Base< Derived< T > >
{

public:

    typedef class Base< Derived< T > > BaseType;

private:

    // This here is the offending line 
    friend class BaseType;

    void foo_i() { std::cout << "foo\n"; }

};

Derived< int > crash_dummy;

лязг говорит:

[...]/main.cpp:38:22: error: elaborated type refers to a typedef
    friend class BaseType;
             ^
[...]/main.cpp:33:44: note: declared here
    typedef class Base< Derived< T > > BaseType;

Как я могу это исправить? Я заметил, что могу просто напечатать все это только для объявления класса друга, и это прекрасно работает, но даже небольшой дублированный код заставляет меня чувствовать себя немного неловко, поэтому я ищу более элегантное «правильное» решение ,

Ответы на вопрос(4)

Ваш ответ на вопрос